Skip to content
Snippets Groups Projects
read_input_file.f90 75.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|
    !                                                                              |
    !              ||===\\                                                         | 
    !              ||    \\                                                        |
    !              ||     ||   //==\\   ||  ||   //==||  ||/==\\                   |
    !              ||     ||  ||    ||  ||  ||  ||   ||  ||    ||                  |
    !              ||    //   ||    ||  ||  ||  ||   ||  ||                        |
    !              ||===//     \\==//    \\==\\  \\==\\  ||                        |
    !                                                                              |
    !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|
    !                                                                              |
    !              READ_INPUT_FILE    Feb. 2007                                    |
    !                                                                              |
    !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|
    
    
    subroutine read_input_file (params,threadinfo,material0,mat,surface,boxes,     &
    
                               sections,cube_faces,nest,bcdef)         
    
    
    !------------------------------------------------------------------------------|
    !(((((((((((((((( Purpose of the routine  ))))))))))))))))))))))))))))))))))))))
    !------------------------------------------------------------------------------|
    
    
    ! subroutine where default values for all input parameters other than the
    ! controlling parameters are defined
    
    ! it is also where the input file 'input.txt' is read and the corresponding
    ! parameters are set
    
    ! nstep is number of time steps
    
    ! ns is number of surface - read in read_controlling_parameters
    
    ! dt is time step length
    !  (note that if dt is negative, it will be replaced by a dynamically
    !   determined value derived from Courant's condition and Courant's
    !   parameter called "courant")
    
    ! nmat is number of material - read in read_controlling_parameters
    
    ! material0 is material number for stuff above 1st surface
    !   or reference material when there is no surface
    ! mat:material properties, including, density,viscosity and compressibility
    !     penalty parameters; ms is dimensioned (0:nmat)
    !     material 0 is void
    ! leveluniform_oct is level of uniform discretization (power of 2)
    ! levelmax_oct is maximum discretization level
    
    ! matrule is the flag that determines the rule used for assigning material
    !    properties within the model volume
    
    ! levelcut is maximum level (within a leave) used to estimate integrals
    !    in divfem approximation
    ! levelapprox is maximum level to use to estimate positive volume
    !    beyond levelcut
    ! noctreemax is maximum size of octrees when they are created
    ! penalty is penalty parameters for linear constraints arising from
    !    bad faces in octree discretization (should be large)
    ! tempscale is temperature scaling parameter
    ! strain_ratio is used for refinement (if=1 no refinement;
    !    if=0 uniform refinement) down to levelmax_oct
    ! istrain_refine: two algortihms are allowed for the refinement based on the strain ratio
    !    one is based on the maximum difference between any two components of velocity
    !    inside an element (istrain_refine=0) the other is based on the norm of the
    !    velocity gradient (istrain_refine=1). Default is istrain_refine=1
    ! courant is ratio of courant conditoin used for moving particles (<1)
    ! stretch is the maximum allowed increase in linear length between two initially
    !    adjacent particles on any surface; when this stretch is achieved, a new
    !    particle is inserted on the surface, half-way along the stretched edge
    !    stretch is specific to each surface
    ! anglemax is the maximum allowed angle between two adjacent normals; when the
    !    angle is reached, a new point is injected
    !    anglemax is specific to each surface
    !    default value is 1.d0
    ! surface are surface structure
    !    for each surface, one needs to define a levelt, itype, material and fnme.
    
    !    levelt is the initial level for the particles on the surface; to be accurate
    
    !    and avoid wholes in the surface during definition of the lsf, one should use
    !    levelt=levelmax_oct+1 for all surfaces as a minimum value; itype should be 1
    !    for foldable surfaces or 0 for nonfoldable surfaces; material is the material
    !    type refering to the table of material available (max nmat); fnme is the name
    !    of the file containing the geometry of the particles defining the surface
    ! npmin is the minimum number of particles in the strain cloud per element
    ! npmax is the maximum number of particles in the strain cloud per element
    !       at levelmax_oct level (smallest possible elements)
    ! nonlineariter is number of iterations in nonlinear analysis
    !   if nonlineariter is 0 no nonlinear iterations are performed (linear analysis)
    !   if nonlineariter is positive, nonlineariter is the number of iterations performed
    !                         regardless of convergence of solution
    !   if nonlineariter is negative, -nonlineariter is maximum number of iterations allowed
    !                         to reach convergence as determined by tol
    ! tol is relative tolerance (duvw/uvw) to achieve convergence
    ! criterion is criterion used to define the octree in the vicinity of the
    !    sufaces; criterion 1 corresponds to imposing that all leaves that contain at
    !    least one particle of any surface is at levelmax_oct; criterion 2 corresponds
    !    to imposing that discretization is proportional to the curvature of the
    !    surface; curvature is calculated from the local divergence of the normals.
    !    the criterion is specific to each surface (default is 2)
    ! anglemaxoctree is only defined for criterion 2; it is the maximum allowable angle
    !    between two adjacent normals; if the angle is greater than anglemaxoctree, the local
    !    octree leaves are forced to be at level levelmax_oct; otherwise they are
    !    proportionally larger (smaller levels) (default is 10)
    !    anglemaxoctree is specific to each surface
    !   (be aware that these files are enormous...)
    ! niter_move is number of iterations used to move particles in an
    !  implicit, mid-point algorithm
    ! restart is a restart flag; if irestart is not 0, the run will restart from
    
    !    an output file given by restartfile and at step irestart+1 - read in
    !    read_controlling_parameters
    
    ! ismooth is a flag to impose an additional level of smoothing after refinement
    !    for the surfaces and strain rate. It ensures that no leaf is flanked by
    !    other leaves diffeing by more than 1 level of refinement
    !    If ismooth is 0, no smoothing is performed; if ismooth is set to 1, smoothing
    !    is performed (default is 1)
    ! boxes is the set of nboxes box structures defined by the user where a set level
    !    of discretization is imposed
    
    !------------------------------------------------------------------------------|
    !((((((((((((((((  declaration of the subroutine arguments  ))))))))))))))))))))
    !------------------------------------------------------------------------------|
    
    
    use definitions
    
    type (parameters) params
    type (thread) threadinfo
    integer material0
    type (material) mat(0:params%nmat)
    type (sheet) surface(params%ns)
    type (box) boxes(params%nboxes)
    type (cross_section) sections(params%nsections)
    type (face),dimension(6) :: cube_faces
    
    type (nest_info) :: nest
    
    type (bc_definition) :: bcdef
    
    
    !------------------------------------------------------------------------------|
    !(((((((((((((((( declaration of the subroutine internal variables )))))))))))))
    !------------------------------------------------------------------------------|
    
    
    Dave Whipp's avatar
    Dave Whipp committed
    character(len=72) :: shift
    character(len=3)  :: cm
    character(len=1)  :: answer
    
    integer iran,doru
    integer flag
    
    !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|
    
    call mpi_comm_size (mpi_comm_world,nproc,ierr)
    call mpi_comm_rank (mpi_comm_world,iproc,ierr)
    
    Dave Whipp's avatar
    Dave Whipp committed
    shift=' '
    
    
    !==============================================================================
    !==============================================================================
    
    params%nstep=2
    if (iproc==0) call scanfile (params%infile,'nstep',params%nstep,ires)
    call mpi_bcast(params%nstep,1,mpi_integer,0,mpi_comm_world,ierr)
    
    !=====[material properties]====================================================
    
    material0=0
    if (iproc==0) call scanfile (params%infile,'material0',material0,ires)
    call mpi_bcast(material0,1,mpi_integer,0,mpi_comm_world,ierr)
    
    
    params%bulkvisc=.false.
    if (iproc==0) then
      call scanfile (params%infile,'bulkvisc',answer,ires)
      params%bulkvisc=(trim(answer)=='T')
    endif
    call mpi_bcast(params%bulkvisc,1,mpi_logical,0,mpi_comm_world,ierr)
    
    params%init_e2d=.false.
    if (iproc==0) then
      call scanfile (params%infile,'init_e2d',answer,ires)
      params%init_e2d=(trim(answer)=='T')
    endif
    call mpi_bcast(params%init_e2d,1,mpi_logical,0,mpi_comm_world,ierr)
    
    
    params%e2d0=1.d0
    if (iproc==0) call scanfile (params%infile,'e2d0',params%e2d0,ires)
    call mpi_bcast(params%e2d0,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
    params%minp=-1.d0
    if (iproc==0) call scanfile (params%infile,'minp',params%minp,ires)
    call mpi_bcast(params%minp,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
    params%pressure0=0.d0
    if (iproc==0) call scanfile (params%infile,'pressure0',params%pressure0,ires)
    call mpi_bcast(params%pressure0,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
    do i=0,params%nmat
       write(cm,'(i3)') i
       il=1
       if (i.lt.100) il=2
       if (i.lt.10) il=3
    
       mat(i)%density=1.d0
       if (i.eq.0) mat(i)%density=0.d0
       if (iproc==0) call scanfile (params%infile,'density'//cm(il:3),mat(i)%density,ires)
       call mpi_bcast(mat(i)%density,1,mpi_double_precision,0,mpi_comm_world,ierr)
     
       mat(i)%viscosity=1.d0
       if (i.eq.0) mat(i)%viscosity=1.d-8
       if (iproc==0) call scanfile (params%infile,'viscosity'//cm(il:3),mat(i)%viscosity,ires)
       call mpi_bcast(mat(i)%viscosity,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       mat(i)%penalty=1.d8
       if (iproc==0) call scanfile (params%infile,'penalty'//cm(il:3),mat(i)%penalty,ires)
       call mpi_bcast(mat(i)%penalty,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       mat(i)%expon=1.d0
       if (iproc==0) call scanfile (params%infile,'expon'//cm(il:3),mat(i)%expon,ires)
       call mpi_bcast(mat(i)%expon,1,mpi_double_precision,0,mpi_comm_world,ierr)
       
       mat(i)%activationenergy=0.d0
       if (iproc==0) call scanfile (params%infile,'activationenergy'//cm(il:3),mat(i)%activationenergy,ires)
       call mpi_bcast(mat(i)%activationenergy,1,mpi_double_precision,0,mpi_comm_world,ierr)
       
       mat(i)%expansion=0.d0
       if (iproc==0) call scanfile (params%infile,'expansion'//cm(il:3),mat(i)%expansion,ires)
       call mpi_bcast(mat(i)%expansion,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       mat(i)%diffusivity=1.d0
       if (iproc==0) call scanfile (params%infile,'diffusivity'//cm(il:3),mat(i)%diffusivity,ires)
       call mpi_bcast(mat(i)%diffusivity,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       mat(i)%heat=0.d0
       if (iproc==0) call scanfile (params%infile,'heat'//cm(il:3),mat(i)%heat,ires)
       call mpi_bcast(mat(i)%heat,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       mat(i)%plasticity_type='No'
       if (iproc==0) call scanfile (params%infile,'plasticity_type'//cm(il:3),mat(i)%plasticity_type,ires)
       call mpi_bcast(mat(i)%plasticity_type,8,mpi_character,0,mpi_comm_world,ierr)
    
       mat(i)%plasticity_parameters=0.d0
       mat(i)%plasticity_parameters(5)=-1.d0
       if ( trim(mat(i)%plasticity_type).ne.'No') then
           if (iproc==0) call scanfile (params%infile,'plasticity_1st_param'//cm(il:3),mat(i)%plasticity_parameters(1),ires)
           if (iproc==0) call scanfile (params%infile,'plasticity_2nd_param'//cm(il:3),mat(i)%plasticity_parameters(2),ires)
           if (iproc==0) call scanfile (params%infile,'plasticity_3rd_param'//cm(il:3),mat(i)%plasticity_parameters(3),ires)
           if (iproc==0) call scanfile (params%infile,'plasticity_4th_param'//cm(il:3),mat(i)%plasticity_parameters(4),ires)
           if (iproc==0) call scanfile (params%infile,'plasticity_5th_param'//cm(il:3),mat(i)%plasticity_parameters(5),ires)
           if (iproc==0) call scanfile (params%infile,'plasticity_6th_param'//cm(il:3),mat(i)%plasticity_parameters(6),ires)
           if (iproc==0) call scanfile (params%infile,'plasticity_7th_param'//cm(il:3),mat(i)%plasticity_parameters(7),ires)
           if (iproc==0) call scanfile (params%infile,'plasticity_8th_param'//cm(il:3),mat(i)%plasticity_parameters(8),ires)
           if (iproc==0) call scanfile (params%infile,'plasticity_9th_param'//cm(il:3),mat(i)%plasticity_parameters(9),ires)
           call mpi_bcast(mat(i)%plasticity_parameters,9,mpi_double_precision,0,mpi_comm_world,ierr)
       endif
    
    
       mat(i)%mattrans=-1.d0
       if (iproc==0) call scanfile (params%infile,'mattrans_xmin'//cm(il:3),mat(i)%mattrans(1),ires)
       if (iproc==0) call scanfile (params%infile,'mattrans_xmax'//cm(il:3),mat(i)%mattrans(2),ires)
       if (iproc==0) call scanfile (params%infile,'mattrans_ymin'//cm(il:3),mat(i)%mattrans(3),ires)
       if (iproc==0) call scanfile (params%infile,'mattrans_ymax'//cm(il:3),mat(i)%mattrans(4),ires)
       if (iproc==0) call scanfile (params%infile,'mattrans_zmin'//cm(il:3),mat(i)%mattrans(5),ires)
       if (iproc==0) call scanfile (params%infile,'mattrans_zmax'//cm(il:3),mat(i)%mattrans(6),ires)
       call mpi_bcast(mat(i)%mattrans,6,mpi_double_precision,0,mpi_comm_world,ierr)
       
    
       if (iproc==0) call scanfile (params%infile,'transnum_xmin'//cm(il:3),mat(i)%transnum(1),ires)
       if (iproc==0) call scanfile (params%infile,'transnum_xmax'//cm(il:3),mat(i)%transnum(2),ires)
       if (iproc==0) call scanfile (params%infile,'transnum_ymin'//cm(il:3),mat(i)%transnum(3),ires)
       if (iproc==0) call scanfile (params%infile,'transnum_ymax'//cm(il:3),mat(i)%transnum(4),ires)
       if (iproc==0) call scanfile (params%infile,'transnum_zmin'//cm(il:3),mat(i)%transnum(5),ires)
       if (iproc==0) call scanfile (params%infile,'transnum_zmax'//cm(il:3),mat(i)%transnum(6),ires)
       call mpi_bcast(mat(i)%transnum,6,mpi_integer,0,mpi_comm_world,ierr)
    
    enddo
    
    params%viscositymin=-1.d0
    if (iproc==0) call scanfile (params%infile,'viscositymin',params%viscositymin,ires)
    call mpi_bcast(params%viscositymin,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    params%viscositymax=-1.d0
    if (iproc==0) call scanfile (params%infile,'viscositymax',params%viscositymax,ires)
    call mpi_bcast(params%viscositymax,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
    params%vex=1.d0
    if (iproc==0) call scanfile (params%infile,'vex',params%vex,ires)
    call mpi_bcast(params%vex,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
    params%leveluniform_oct=3
    if (iproc==0) call scanfile (params%infile,'leveluniform_oct',params%leveluniform_oct,ires)
    call mpi_bcast(params%leveluniform_oct,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%levelmax_oct=4
    if (iproc==0) call scanfile (params%infile,'levelmax_oct',params%levelmax_oct,ires)
    call mpi_bcast(params%levelmax_oct,1,mpi_integer,0,mpi_comm_world,ierr)
    
    
    params%matrule=0
    if (iproc==0) call scanfile (params%infile,'matrule',params%matrule,ires)
    call mpi_bcast(params%matrule,1,mpi_integer,0,mpi_comm_world,ierr)
    
    
    params%levelcut=2
    if (iproc==0) call scanfile (params%infile,'levelcut',params%levelcut,ires)
    call mpi_bcast(params%levelcut,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%levelapprox=3
    if (iproc.eq.0) call scanfile (params%infile,'levelapprox',params%levelapprox,ires)
    call mpi_bcast(params%levelapprox,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%calculate_temp=.true.
    if (iproc==0) then
       call scanfile (params%infile,'calculate_temp',answer,ires)
       params%calculate_temp=(trim(answer)=='T')
    end if
    call mpi_bcast(params%calculate_temp,1,mpi_logical,0,mpi_comm_world,ierr)
    
    params%ztemp=1.d0
    if (iproc==0) call scanfile (params%infile,'ztemp',params%ztemp,ires)
    
    call mpi_bcast(params%ztemp,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    params%smoothing_type=0
    if (iproc==0) call scanfile (params%infile,'smoothing_type',params%smoothing_type,ires)
    call mpi_bcast(params%smoothing_type,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%normaladvect=.false.
    if (iproc==0) then
       call scanfile (params%infile,'normaladvect',answer,ires)
       params%normaladvect=(trim(answer)=='T')
    end if
    call mpi_bcast(params%normaladvect,1,mpi_logical,0,mpi_comm_world,ierr)
    
    params%excl_vol=.false.
    if (iproc==0) then
       call scanfile (params%infile,'excl_vol',answer,ires)
       params%excl_vol=(trim(answer)=='T')
    end if
    call mpi_bcast(params%excl_vol,1,mpi_logical,0,mpi_comm_world,ierr)
    
    params%adaptive_tol=.false.
    if (iproc==0) then
       call scanfile (params%infile,'adaptive_tol',answer,ires)
       params%adaptive_tol=(trim(answer)=='T')
    end if
    call mpi_bcast(params%adaptive_tol,1,mpi_logical,0,mpi_comm_world,ierr)
    
    !=====[surface properties]=====================================================
    do i=1,params%ns
       write(cm,'(i3)') i
       il=1
       if (i.lt.100) il=2
       if (il.lt.10) il=3
       
       surface(i)%itype=1
       if (iproc==0) call scanfile (params%infile,'itype'//cm(il:3),surface(i)%itype,ires)
       call mpi_bcast(surface(i)%itype,1,mpi_integer,0,mpi_comm_world,ierr)
       
       surface(i)%material=1
       if (iproc==0) call scanfile (params%infile,'material'//cm(il:3),surface(i)%material,ires)
       call mpi_bcast(surface(i)%material,1,mpi_integer,0,mpi_comm_world,ierr)
    
       surface(i)%rand=.false.
       if (iproc==0) then
          call scanfile (params%infile,'rand'//cm(il:3),answer,ires)
          surface(i)%rand=(trim(answer)=='T')
       end if
       call mpi_bcast(surface(i)%rand,1,mpi_logical,0,mpi_comm_world,ierr)
       
       surface(i)%levelt=params%levelmax_oct+1
       if (iproc==0) call scanfile (params%infile,'levelt'//cm(il:3),surface(i)%levelt,ires)
       call mpi_bcast(surface(i)%levelt,1,mpi_integer,0,mpi_comm_world,ierr)
       
       surface(i)%stretch=1.5d0
       if (iproc==0) call scanfile (params%infile,'stretch'//cm(il:3),surface(i)%stretch,ires)
       call mpi_bcast(surface(i)%stretch,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       surface(i)%criterion=1
       if (iproc==0) call scanfile (params%infile,'criterion'//cm(il:3),surface(i)%criterion,ires)
       call mpi_bcast(surface(i)%criterion,1,mpi_integer,0,mpi_comm_world,ierr)
    
       surface(i)%anglemax=1.d0
       if (iproc==0) call scanfile (params%infile,'anglemax'//cm(il:3),surface(i)%anglemax,ires)
       surface(i)%anglemax=surface(i)%anglemax*pi/180.d0
       call mpi_bcast(surface(i)%anglemax,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       surface(i)%anglemaxoctree=1.d0
       if (iproc==0) call scanfile (params%infile,'anglemaxoctree'//cm(il:3),surface(i)%anglemaxoctree,ires)
       surface(i)%anglemaxoctree=surface(i)%anglemaxoctree*pi/180.d0
       call mpi_bcast(surface(i)%anglemaxoctree,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       surface(i)%spread_surface_points=0
       if (iproc==0) call scanfile (params%infile,'spread_surface_points'//cm(il:3),surface(i)%spread_surface_points,ires)
       call mpi_bcast(surface(i)%spread_surface_points,1,mpi_integer,0,mpi_comm_world,ierr)
    
    
       if (iproc==0) call scanfile (params%infile,'surface_type_'//cm(il:3),surface(i)%surface_type,ires)
       call mpi_bcast(surface(i)%surface_type,1,mpi_integer,0,mpi_comm_world,ierr)
     
    
       if (iproc==0) call scanfile (params%infile,'surface_param_01_'//cm(il:3),surface(i)%sp01,ires)
    
       if (iproc==0) call scanfile (params%infile,'surface_param_02_'//cm(il:3),surface(i)%sp02,ires)
    
       if (iproc==0) call scanfile (params%infile,'surface_param_03_'//cm(il:3),surface(i)%sp03,ires)
    
       if (iproc==0) call scanfile (params%infile,'surface_param_04_'//cm(il:3),surface(i)%sp04,ires)
    
       if (iproc==0) call scanfile (params%infile,'surface_param_05_'//cm(il:3),surface(i)%sp05,ires)
    
       if (iproc==0) call scanfile (params%infile,'surface_param_06_'//cm(il:3),surface(i)%sp06,ires)
    
       if (iproc==0) call scanfile (params%infile,'surface_param_07_'//cm(il:3),surface(i)%sp07,ires)
    
       if (iproc==0) call scanfile (params%infile,'surface_param_08_'//cm(il:3),surface(i)%sp08,ires)
    
       if (iproc==0) call scanfile (params%infile,'surface_param_09_'//cm(il:3),surface(i)%sp09,ires)
    
       if (iproc==0) call scanfile (params%infile,'surface_param_10_'//cm(il:3),surface(i)%sp10,ires)
    
       if (iproc==0) call scanfile (params%infile,'surface_param_11_'//cm(il:3),surface(i)%sp11,ires)
    
       if (iproc==0) call scanfile (params%infile,'surface_param_12_'//cm(il:3),surface(i)%sp12,ires)
    
       
       call mpi_bcast(surface(i)%sp01,1,mpi_double_precision,0,mpi_comm_world,ierr)
       call mpi_bcast(surface(i)%sp02,1,mpi_double_precision,0,mpi_comm_world,ierr)
       call mpi_bcast(surface(i)%sp03,1,mpi_double_precision,0,mpi_comm_world,ierr)
       call mpi_bcast(surface(i)%sp04,1,mpi_double_precision,0,mpi_comm_world,ierr)
       call mpi_bcast(surface(i)%sp05,1,mpi_double_precision,0,mpi_comm_world,ierr)
       call mpi_bcast(surface(i)%sp06,1,mpi_double_precision,0,mpi_comm_world,ierr)
       call mpi_bcast(surface(i)%sp07,1,mpi_double_precision,0,mpi_comm_world,ierr)
       call mpi_bcast(surface(i)%sp08,1,mpi_double_precision,0,mpi_comm_world,ierr)
       call mpi_bcast(surface(i)%sp09,1,mpi_double_precision,0,mpi_comm_world,ierr)
       call mpi_bcast(surface(i)%sp10,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       call mpi_bcast(surface(i)%sp11,1,mpi_double_precision,0,mpi_comm_world,ierr)
       call mpi_bcast(surface(i)%sp12,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
       surface(i)%activation_time=-1.d0
       if (iproc==0) call scanfile (params%infile,'activation_time_'//cm(il:3),surface(i)%activation_time,ires)
       call mpi_bcast(surface(i)%activation_time,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       surface(i)%leveloct=6
       if (iproc==0) call scanfile (params%infile,'leveloct'//cm(il:3),surface(i)%leveloct,ires)
       call mpi_bcast(surface(i)%leveloct,1,mpi_integer,0,mpi_comm_world,ierr)
    enddo
    
    !=====[face refinement parameters]=============================================
    
    params%ref_on_faces=.false.
    if(iproc==0) then
       call scanfile (params%infile,'ref_on_faces',answer,ires)
       params%ref_on_faces=(trim(answer)=='T')
    end if
    call mpi_bcast(params%ref_on_faces,1,mpi_logical,0,mpi_comm_world,ierr)
    
    do i=1,6
       write(cm,'(i3)') i
    
    
       if (iproc==0) call scanfile (params%infile,'level_face'//cm(3:3),cube_faces(i)%level,ires)
       call mpi_bcast(cube_faces(i)%level,1,mpi_integer,0,mpi_comm_world,ierr)
    
    
       if (iproc==0) call scanfile (params%infile,'l'//cm(3:3),cube_faces(i)%l,ires)
       call mpi_bcast(cube_faces(i)%l,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
       if (iproc==0) call scanfile (params%infile,'r'//cm(3:3),cube_faces(i)%r,ires)
       call mpi_bcast(cube_faces(i)%r,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
       if (iproc==0) call scanfile (params%infile,'b'//cm(3:3),cube_faces(i)%b,ires)
       call mpi_bcast(cube_faces(i)%b,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
       if (iproc==0) call scanfile (params%infile,'t'//cm(3:3),cube_faces(i)%t,ires)
       call mpi_bcast(cube_faces(i)%t,1,mpi_double_precision,0,mpi_comm_world,ierr)
    end do
    
    params%noctreemax=100000
    if(iproc==0) call scanfile (params%infile,'noctreemax',params%noctreemax,ires)
    call mpi_bcast(params%noctreemax,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%nonlinear_iterations=3
    if(iproc==0) call scanfile (params%infile,'nonlinear_iterations',params%nonlinear_iterations,ires)
    call mpi_bcast(params%nonlinear_iterations,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%initial_refine_level=6
    if (iproc==0) call scanfile (params%infile,'initial_refine_level',params%initial_refine_level,ires)
    call mpi_bcast(params%initial_refine_level,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%dt=0.5d0
    if (iproc==0) call scanfile (params%infile,'dt',params%dt,ires)
    call mpi_bcast(params%dt,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
    params%damp_surface=.true.
    if (iproc==0) then
       call scanfile (params%infile,'damp_surface',answer,ires)
       params%damp_surface = (trim(answer)=='T')
    end if
    call mpi_bcast(params%damp_surface,1,mpi_logical,0,mpi_comm_world,ierr)
    
    
    params%damp_factor=1.0d0
    if (iproc==0) call scanfile (params%infile,'damp_factor',params%damp_factor,ires)
    call mpi_bcast(params%damp_factor,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
    params%remove_surf_pts=.false.
    if (iproc==0) then
       call scanfile (params%infile,'remove_surf_pts',answer,ires)
       params%remove_surf_pts = (trim(answer)=='T')
    end if
    call mpi_bcast(params%remove_surf_pts,1,mpi_logical,0,mpi_comm_world,ierr)
    
    
    params%penalty=1.d8
    if (iproc==0) call scanfile (params%infile,'penalty',params%penalty,ires)
    call mpi_bcast(params%penalty,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    params%tempscale=1.d0
    if (iproc==0) call scanfile (params%infile,'tempscale',params%tempscale,ires)
    call mpi_bcast(params%tempscale,1,mpi_double_precision,0,mpi_comm_world,ierr)
          
    params%refine_ratio=1.d0                                                          
    if (iproc==0) call scanfile (params%infile,'refine_ratio',params%refine_ratio,ires)              
    call mpi_bcast(params%refine_ratio,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    params%refine_criterion=1                                                       
    if(iproc==0) call scanfile (params%infile,'refine_criterion',params%refine_criterion,ires)    
    call mpi_bcast(params%refine_criterion,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%octree_refine_ratio=1.d0                                                   
    if (iproc.eq.0) call scanfile (params%infile,'octree_refine_ratio',params%octree_refine_ratio,ires)
    call mpi_bcast(params%octree_refine_ratio,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    params%courant=.5d0
    if( iproc==0) call scanfile (params%infile,'courant',params%courant,ires)
    call mpi_bcast(params%courant,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
    !=====[boundary conditions]=====================================================
    
    params%invariants_2d=.false.
    if(iproc==0) then
       call scanfile (params%infile,'invariants_2d',answer,ires)
       params%invariants_2d=(trim(answer)=='T')
    end if
    call mpi_bcast(params%invariants_2d,1,mpi_logical,0,mpi_comm_world,ierr)
    
    bcdef%bctype=''
    if (iproc.eq.0) call scanfile (params%infile,'bctype',bcdef%bctype,ires)
    call mpi_bcast(bcdef%bctype,40,mpi_character,0,mpi_comm_world,ierr)
    
    select case(trim(bcdef%bctype))
    case('basic')
      bcdef%bcorder='xyz'
      if (iproc.eq.0) call scanfile (params%infile,'bcorder',bcdef%bcorder,ires)
      call mpi_bcast(bcdef%bcorder,3,mpi_character,0,mpi_comm_world,ierr)
    
      bcdef%fixux0=.true.
      bcdef%fixux1=.true.
      bcdef%fixvx0=.true.
      bcdef%fixvx1=.true.
      bcdef%fixwx0=.true.
      bcdef%fixwx1=.true.
      bcdef%fixuy0=.true.
      bcdef%fixuy1=.true.
      bcdef%fixvy0=.true.
      bcdef%fixvy1=.true.
      bcdef%fixwy0=.true.
      bcdef%fixwy1=.true.
      bcdef%fixuz0=.true.
      bcdef%fixuz1=.true.
      bcdef%fixvz0=.true.
      bcdef%fixvz1=.true.
      bcdef%fixwz0=.true.
      bcdef%fixwz1=.true.
      if(iproc==0) then
        call scanfile (params%infile,'fixux0',answer,ires)
        bcdef%fixux0=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixux1',answer,ires)
        bcdef%fixux1=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixvx0',answer,ires)
        bcdef%fixvx0=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixvx1',answer,ires)
        bcdef%fixvx1=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixwx0',answer,ires)
        bcdef%fixwx0=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixwx1',answer,ires)
        bcdef%fixwx1=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixuy0',answer,ires)
        bcdef%fixuy0=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixuy1',answer,ires)
        bcdef%fixuy1=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixvy0',answer,ires)
        bcdef%fixvy0=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixvy1',answer,ires)
        bcdef%fixvy1=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixwy0',answer,ires)
        bcdef%fixwy0=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixwy1',answer,ires)
        bcdef%fixwy1=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixuz0',answer,ires)
        bcdef%fixuz0=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixuz1',answer,ires)
        bcdef%fixuz1=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixvz0',answer,ires)
        bcdef%fixvz0=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixvz1',answer,ires)
        bcdef%fixvz1=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixwz0',answer,ires)
        bcdef%fixwz0=(trim(answer)=='T')
      endif
      if(iproc==0) then
        call scanfile (params%infile,'fixwz1',answer,ires)
        bcdef%fixwz1=(trim(answer)=='T')
      endif
      call mpi_bcast(bcdef%fixux0,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixux1,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixvx0,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixvx1,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixwx0,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixwx1,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixuy0,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixuy1,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixvy0,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixvy1,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixwy0,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixwy1,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixuz0,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixuz1,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixvz0,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixvz1,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixwz0,1,mpi_logical,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%fixwz1,1,mpi_logical,0,mpi_comm_world,ierr)
    
      bcdef%ux0=0.d0
      bcdef%ux1=0.d0
      bcdef%vx0=0.d0
      bcdef%vx1=0.d0
      bcdef%wx0=0.d0
      bcdef%wx1=0.d0
      bcdef%uy0=0.d0
      bcdef%uy1=0.d0
      bcdef%vy0=0.d0
      bcdef%vy1=0.d0
      bcdef%wy0=0.d0
      bcdef%wy1=0.d0
      bcdef%uz0=0.d0
      bcdef%uz1=0.d0
      bcdef%vz0=0.d0
      bcdef%vz1=0.d0
      bcdef%wz0=0.d0
      bcdef%wz1=0.d0
      if (iproc==0) call scanfile (params%infile,'ux0',bcdef%ux0,ires)
      if (iproc==0) call scanfile (params%infile,'ux1',bcdef%ux1,ires)
      if (iproc==0) call scanfile (params%infile,'vx0',bcdef%vx0,ires)
      if (iproc==0) call scanfile (params%infile,'vx1',bcdef%vx1,ires)
      if (iproc==0) call scanfile (params%infile,'wx0',bcdef%wx0,ires)
      if (iproc==0) call scanfile (params%infile,'wx1',bcdef%wx1,ires)
      if (iproc==0) call scanfile (params%infile,'uy0',bcdef%uy0,ires)
      if (iproc==0) call scanfile (params%infile,'uy1',bcdef%uy1,ires)
      if (iproc==0) call scanfile (params%infile,'vy0',bcdef%vy0,ires)
      if (iproc==0) call scanfile (params%infile,'vy1',bcdef%vy1,ires)
      if (iproc==0) call scanfile (params%infile,'wy0',bcdef%wy0,ires)
      if (iproc==0) call scanfile (params%infile,'wy1',bcdef%wy1,ires)
      if (iproc==0) call scanfile (params%infile,'uz0',bcdef%uz0,ires)
      if (iproc==0) call scanfile (params%infile,'uz1',bcdef%uz1,ires)
      if (iproc==0) call scanfile (params%infile,'vz0',bcdef%vz0,ires)
      if (iproc==0) call scanfile (params%infile,'vz1',bcdef%vz1,ires)
      if (iproc==0) call scanfile (params%infile,'wz0',bcdef%wz0,ires)
      if (iproc==0) call scanfile (params%infile,'wz1',bcdef%wz1,ires)
      call mpi_bcast(bcdef%ux0,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%ux1,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%vx0,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%vx1,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%wx0,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%wx1,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%uy0,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%uy1,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%vy0,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%vy1,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%wy0,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%wy1,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%uz0,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%uz1,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%vz0,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%vz1,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%wz0,1,mpi_double_precision,0,mpi_comm_world,ierr)
      call mpi_bcast(bcdef%wz1,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
    Dave Whipp's avatar
    Dave Whipp committed
    case('segmented_s_line')
    
      bcdef%bc_parameters=0.d0
      if (iproc==0) call scanfile (params%infile,'bc_param1',bcdef%bc_parameters(1),ires)
      if (iproc==0) call scanfile (params%infile,'bc_param2',bcdef%bc_parameters(2),ires)
      if (iproc==0) call scanfile (params%infile,'bc_param3',bcdef%bc_parameters(3),ires)
      if (iproc==0) call scanfile (params%infile,'bc_param4',bcdef%bc_parameters(4),ires)
      if (iproc==0) call scanfile (params%infile,'bc_param5',bcdef%bc_parameters(5),ires)
      if (iproc==0) call scanfile (params%infile,'bc_param6',bcdef%bc_parameters(6),ires)
      if (iproc==0) call scanfile (params%infile,'bc_param7',bcdef%bc_parameters(7),ires)
      if (iproc==0) call scanfile (params%infile,'bc_param8',bcdef%bc_parameters(8),ires)
      if (iproc==0) call scanfile (params%infile,'bc_param9',bcdef%bc_parameters(9),ires)
      if (iproc==0) call scanfile (params%infile,'bc_param10',bcdef%bc_parameters(10),ires)
      if (iproc==0) call scanfile (params%infile,'bc_param11',bcdef%bc_parameters(11),ires)
      if (iproc==0) call scanfile (params%infile,'bc_param12',bcdef%bc_parameters(12),ires)
      call mpi_bcast(bcdef%bc_parameters,12,mpi_double_precision,0,mpi_comm_world,ierr)
    end select
    
    bcdef%utrans=0.d0
    bcdef%vtrans=0.d0
    if (iproc==0) call scanfile (params%infile,'utrans',bcdef%utrans,ires)
    if (iproc==0) call scanfile (params%infile,'vtrans',bcdef%vtrans,ires)
    call mpi_bcast(bcdef%utrans,1,mpi_double_precision,0,mpi_comm_world,ierr)
    call mpi_bcast(bcdef%vtrans,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    
    params%npmin=8
    if (iproc==0) call scanfile (params%infile,'npmin',params%npmin,ires)
    call mpi_bcast(params%npmin,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%npmax=16
    if (iproc==0) call scanfile (params%infile,'npmax',params%npmax,ires)
    call mpi_bcast(params%npmax,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%griditer=-10
    if (iproc==0) call scanfile (params%infile,'griditer',params%griditer,ires)
    call mpi_bcast(params%griditer,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%tol=1.d-3
    if (iproc==0) call scanfile (params%infile,'tol',params%tol,ires)
    call mpi_bcast(params%tol,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    params%niter_move=10
    if (iproc==0) call scanfile (params%infile,'niter_move',params%niter_move,ires)
    call mpi_bcast(params%niter_move,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%ismooth=.false.
    if (iproc==0) then
       call scanfile (params%infile,'ismooth',answer,ires)
       params%ismooth = (trim(answer)=='T')
    end if
    call mpi_bcast(params%ismooth,1,mpi_logical,0,mpi_comm_world,ierr)
    
    params%nb_iter_nl_min=0
    if (iproc==0) call scanfile (params%infile,'nb_iter_nl_min',params%nb_iter_nl_min,ires)
    call mpi_bcast(params%nb_iter_nl_min,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%visualise_matrix=.false.
    if (iproc==0) then
       call scanfile (params%infile,'visualise_matrix',answer,ires)
       params%visualise_matrix=(trim(answer)=='T')
    end if
    call mpi_bcast(params%visualise_matrix,1,mpi_logical,0,mpi_comm_world,ierr)
    
    params%renumber_nodes  = .false.
    if (iproc==0) then
       call scanfile (params%infile,'renumber_nodes',answer,ires)
       params%renumber_nodes=(trim(answer)=='T')
    end if
    call mpi_bcast(params%renumber_nodes,1,mpi_logical,0,mpi_comm_world,ierr)
    
    do i=1,params%nboxes
       write(cm,'(i3)') i
       il=1
       if (i.lt.100) il=2
       if (il.lt.10) il=3
    
       boxes(i)%x0=0.d0
       if (iproc==0) call scanfile (params%infile,'box'//cm(il:3)//'x0',boxes(i)%x0,ires)
       call mpi_bcast(boxes(i)%x0,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       boxes(i)%x1=0.d0
       if (iproc==0) call scanfile (params%infile,'box'//cm(il:3)//'x1',boxes(i)%x1,ires)
       call mpi_bcast(boxes(i)%x1,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       boxes(i)%y0=0.d0
       if (iproc==0) call scanfile (params%infile,'box'//cm(il:3)//'y0',boxes(i)%y0,ires)
       call mpi_bcast(boxes(i)%y0,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       boxes(i)%y1=0.d0
       if (iproc==0) call scanfile (params%infile,'box'//cm(il:3)//'y1',boxes(i)%y1,ires)
       call mpi_bcast(boxes(i)%y1,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       boxes(i)%z0=0.d0
       if (iproc==0) call scanfile (params%infile,'box'//cm(il:3)//'z0',boxes(i)%z0,ires)
    
       call mpi_bcast(boxes(i)%z0,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       boxes(i)%z1=0.d0
       if (iproc==0) call scanfile (params%infile,'box'//cm(il:3)//'z1',boxes(i)%z1,ires)
    
       call mpi_bcast(boxes(i)%z1,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
       boxes(i)%level=1
       if (iproc==0) call scanfile (params%infile,'box'//cm(il:3)//'level',boxes(i)%level,ires)
       call mpi_bcast(boxes(i)%level,1,mpi_integer,0,mpi_comm_world,ierr)
    enddo
    
    do i=1,params%nsections
       write(cm,'(i3)') i
       il=1
       if (i.lt.100) il=2
       if (il.lt.10) il=3
    
       sections(i)%xyz=0
       if (iproc==0) call scanfile (params%infile,'xyz_'//cm(il:3),sections(i)%xyz,ires)
    
    
       if (iproc==0) call scanfile (params%infile,'slice_'//cm(il:3),sections(i)%slice,ires)
    !   if (sections(i)%slice<0.d0 .or. sections(i)%slice>1.d0) call stop_run ('pb with slice value')
    
       sections(i)%flag_press = .false. 
       if (iproc==0) then
          call scanfile (params%infile,'flag_press_'//cm(il:3),answer,ires)
          sections(i)%flag_press=(trim(answer)=='T')
       end if
    
       sections(i)%flag_spress = .false. 
       if (iproc==0) then
          call scanfile (params%infile,'flag_spress_'//cm(il:3),answer,ires)
          sections(i)%flag_spress=(trim(answer)=='T')
       end if
    
       sections(i)%flag_e2d   = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_e2d_'//cm(il:3),answer,ires)
          sections(i)%flag_e2d=(trim(answer)=='T')
       end if
    
       sections(i)%flag_e3d   = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_e3d_'//cm(il:3),answer,ires)
          sections(i)%flag_e3d=(trim(answer)=='T')
       end if
    
       sections(i)%flag_strain   = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_strain_'//cm(il:3),answer,ires)
          sections(i)%flag_strain=(trim(answer)=='T')
       end if
    
       sections(i)%flag_crit  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_crit_'//cm(il:3),answer,ires)
          sections(i)%flag_crit=(trim(answer)=='T')
       end if
    
       sections(i)%flag_grid  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_grid_'//cm(il:3),answer,ires)
          sections(i)%flag_grid=(trim(answer)=='T')
       end if
    
       sections(i)%flag_u  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_u_'//cm(il:3),answer,ires)
          sections(i)%flag_u=(trim(answer)=='T')
       end if
     
       sections(i)%flag_v  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_v_'//cm(il:3),answer,ires)
          sections(i)%flag_v=(trim(answer)=='T')
       end if
    
       sections(i)%flag_w  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_w_'//cm(il:3),answer,ires)
          sections(i)%flag_w=(trim(answer)=='T')
       end if
    
       sections(i)%flag_uvw  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_uvw_'//cm(il:3),answer,ires)
          sections(i)%flag_uvw=(trim(answer)=='T')
       end if
    
       sections(i)%flag_colour  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_colour_'//cm(il:3),answer,ires)
          sections(i)%flag_colour=(trim(answer)=='T')
       end if
    
       sections(i)%flag_mu  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_mu_'//cm(il:3),answer,ires)
          sections(i)%flag_mu=(trim(answer)=='T')
       end if
    
       sections(i)%flag_plastic  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_plastic_'//cm(il:3),answer,ires)
          sections(i)%flag_plastic=(trim(answer)=='T')
       end if
    
       sections(i)%flag_q  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_q_'//cm(il:3),answer,ires)
          sections(i)%flag_q=(trim(answer)=='T')
       end if
    
       sections(i)%flag_lode  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_lode_'//cm(il:3),answer,ires)
          sections(i)%flag_lode=(trim(answer)=='T')
       end if
    
       sections(i)%flag_vfield  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_vfield_'//cm(il:3),answer,ires)
          sections(i)%flag_vfield=(trim(answer)=='T')
       end if
    
       sections(i)%flag_lsf  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_lsf_'//cm(il:3),answer,ires)
          sections(i)%flag_lsf=(trim(answer)=='T')
       end if
    
       sections(i)%flag_temp  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_temp_'//cm(il:3),answer,ires)
          sections(i)%flag_temp=(trim(answer)=='T')
       end if
    
       sections(i)%flag_velvect  = .false.
       if (iproc==0) then
          call scanfile (params%infile,'flag_velvect_'//cm(il:3),answer,ires)
          sections(i)%flag_velvect=(trim(answer)=='T')
       end if
    
       sections(i)%scale=100.d0
       if (iproc==0) call scanfile (params%infile,'scale_'//cm(il:3),sections(i)%scale,ires)
    
    
       if (iproc==0) call scanfile (params%infile,'colormap_'//cm(il:3),sections(i)%colormap,ires)
    
    
       if (iproc==0) call scanfile (params%infile,'ncolours_'//cm(il:3),sections(i)%ncolours,ires)
    end do
    
    !=====[erosion parameters]=====================================================
    params%erosion=.false.
    if (iproc==0) then
       call scanfile (params%infile,'erosion',answer,ires)
       params%erosion=(trim(answer)=='T')
    end if
    call mpi_bcast(params%erosion,1,mpi_logical,0,mpi_comm_world,ierr)
    
    params%zerosion=0.d0
    if (iproc==0) call scanfile (params%infile,'zerosion',params%zerosion,ires)
    
    call mpi_bcast(params%zerosion,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    params%length_scale=1.d0
    if (iproc==0) call scanfile (params%infile,'length_scale',params%length_scale,ires)
    call mpi_bcast(params%length_scale,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    params%velocity_scale=1.d0
    if (iproc==0) call scanfile (params%infile,'velocity_scale',params%velocity_scale,ires)
    call mpi_bcast(params%velocity_scale,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    params%fluvial_erosion=2.d-1
    if (iproc==0) call scanfile (params%infile,'fluvial_erosion',params%fluvial_erosion,ires)
    call mpi_bcast(params%fluvial_erosion,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    params%diffusion_erosion=8.d0
    if (iproc==0) call scanfile (params%infile,'diffusion_erosion',params%diffusion_erosion,ires)
    call mpi_bcast(params%diffusion_erosion,1,mpi_double_precision,0,mpi_comm_world,ierr)
    
    params%baselevelx0=1
    if (iproc==0) call scanfile (params%infile,'baselevelx0',params%baselevelx0,ires)
    call mpi_bcast(params%baselevelx0,1,mpi_integer,0,mpi_comm_world,ierr)
    
    params%baselevelx1=1
    if (iproc==0) call scanfile (params%infile,'baselevelx1',params%baselevelx1,ires)
    call mpi_bcast(params%baselevelx1,1,mpi_integer,0,mpi_comm_world,ierr)