Code development

The present project is aimed to develop a computer program for solving 1-D unsteady ‘Couette Flow’ problem. Hereafter, the program developed in this project is called ‘CouetteFlow’.

CouetteFlow Code summary

The source code contains the following directories:

  • io - input/output related routines
  • main - main program driver
  • math - thomas algorithm
  • modules - main couette flow solver routines
  • utils - list of useful FORTRAN utilities used within the program
  • couettepy - python wrapper for gridgen main program
Also a ‘CMakeLists.txt’ file is also included for cmake compiling.
$ cd CouetteFlow/src/
$ ls
$ CMakeLists.txt  io  main math modules utils couettepy

The io folder has io.F90 file which contains ReadInput(inputData) subroutine. It also includes input_file_xml which describes the structure of the user run-time input file located in the main ‘src’ directory, and output.F90 for storing data in bothb Tecplot and Python format.

The main folder is only used for containing the code driver file. The main routines is run by couette.F90 which calls important subroutines from the rest of folders.

Details of CouetteFlow development

The source code shown below is couette.F90 and it calls skeletal subroutines for generating grid structure. The main features of the main code is to (1) read input file, (2) make initialized variable arrays, (3) se the BCs and ICs, (4) set the time step for the solver, (5) Non-dimensionalize the variables , (6) use the thomas algorithm to calculate and update the velocity, and (7) finally write output files along with the RMS:

PROGRAM main

      USE xml_data_input_file
      USE CouetteSetup_m,ONLY:Init,EndVars,TimeStep,NonDim2DimVars,&
                              Dim2NonDimVars
      USE parameters_m,ONLY:wp
      USE SimVars_m,ONLY:fileLength,c1,c2,cr,elapse_time,rate,iflag,&
                          dt,t,nmax,rms_SS,rms_US,maxRMS_US
      USE CouetteSolver_m,ONLY:TriDiag,SteadySoln,UnsteadySoln,SteadyRMS,UnsteadyRMS
      USE output_m,ONLY:WritePlotFile,WriteRMS

      IMPLICIT NONE

      TYPE(input_type_t) :: inputData
      CHARACTER(LEN=fileLength) ::output= 'data'
      CHARACTER(LEN=fileLength) :: rmsout = 'rms'
      INTEGER :: n

      ! Start the time measurements
      elapse_time = 0.0_wp

      CALL system_clock(count_rate=cr)
      rate = REAL(cr)
      CALL system_clock(c1)

      ! Call the initialization of variables
      CALL Init(inputData)
      ! Setup the time step based

      IF (dt == 0.0_wp) THEN
              iflag = 0
              WRITE(*,*)'---------------------------------------------------------'
              CALL TimeStep(iflag)
              WRITE(*,*)'---------------------------------------------------------'
              IF (iflag == 1) STOP

      END IF

      CALL SteadySoln()
      CALL NonDim2DimVars()
      CALL UnsteadySoln()
      CALL NonDim2DimVars()

      ! Output Initial Solutions
      WRITE(*,*) 'Printing Initial Solution.......................................'
      CALL WritePlotFile(output,'"y","u","uExact","yp","up","upExact"',inputData,t)
      WRITE(*,*)'-----------------------------------------------------------------'

      ! Time loop
      DO n = 1,nmax

        t = t+dt

        CALL Dim2NonDimVars()
        CALL TriDiag()
        CALL UnsteadySoln()
        CALL NonDim2DimVars()
        CALL UnsteadyRMS()
        CALL SteadyRMS()
        MaxRMS_US = MAX(MaxRMS_US,rms_US)
        CALL WriteRMS(n,rms_SS,rms_US,rmsout,inputData)

        IF (MOD(n,inputData%setup%nout) == 0) THEN
            CALL WritePlotFile(output,'"y","u","uExact","yp","up","upExact"',inputData,t)
        END IF

        IF (rms_SS < inputData%setup%RMSres) THEN
                iflag = 1
                WRITE(*,*) '---------------------------------------------------------------------'
                WRITE(*,*) 'Convergence Successful=======> Printing Solution.....................'
                CALL WritePlotFile(output,'"y","u","uExact","yp","up","upExact"',inputData,t)
                WRITE(*,*) '---------------------------------------------------------------------'
                EXIT
        ENDIF

       END DO

       ! Last check for non-convergence

       IF (iflag /= 1) THEN
               WRITE(*,'(A,X,I6.6,X,A)') 'CONVERGENCE FAILURE WITH',nmax,'ITERATIONS'
       END IF

      CALL system_clock(c2)

      elapse_time = REAL(c2-c1,KIND=wp)/rate

      WRITE(*,*) ""
      WRITE(*,'(A,F10.6,A)') "| Total elapse time: ",elapse_time, " [s]|"

END PROGRAM main