! $Id: nohydro.f90 13536 2010-03-25 15:15:47Z sven.bingert $ !** AUTOMATIC CPARAM.INC GENERATION **************************** ! Declare (for generation of cparam.inc) the number of f array ! variables and auxiliary variables added by this module ! ! CPARAM logical, parameter :: lhydro = .false. ! CPARAM logical, parameter :: lhydro_kinematic = .false. ! MVAR CONTRIBUTION 0 ! MAUX CONTRIBUTION 0 ! ! PENCILS PROVIDED oo(3); ou; uij(3,3); uu(3); u2; sij(3,3) ! PENCILS PROVIDED divu; uij5(3,3); graddivu(3) ! !*************************************************************** module Hydro ! use Cparam use Cdata use Messages use Sub, only: keep_compiler_quiet ! implicit none ! include 'record_types.h' include 'hydro.h' ! real, dimension (nz,3) :: uumz=0. real, dimension (mz,3) :: uumzg=0.,guumz=0. real :: u_out_kep=0.0 real :: tphase_kinflow=-1.,phase1=0., phase2=0. logical :: lpressuregradient_gas=.true.,lcalc_uumean=.false.,lupw_uu=.false. ! real, allocatable, dimension (:,:) :: KS_k,KS_A,KS_B !or through whole field for each wavenumber? real, allocatable, dimension (:) :: KS_omega !or through whole field for each wavenumber? integer :: KS_modes = 3 real, allocatable, dimension (:) :: Zl,dZldr,Pl,dPldtheta real :: ampl_fcont_uu=1. logical :: lforcing_cont_uu=.false. ! integer :: idiag_u2m=0,idiag_um2=0,idiag_oum=0,idiag_o2m=0 integer :: idiag_uxpt=0,idiag_uypt=0,idiag_uzpt=0 integer :: idiag_dtu=0,idiag_urms=0,idiag_umax=0,idiag_uzrms=0 integer :: idiag_uzmax=0,idiag_orms=0,idiag_omax=0 integer :: idiag_ux2m=0,idiag_uy2m=0,idiag_uz2m=0 integer :: idiag_uxuym=0,idiag_uxuzm=0,idiag_uyuzm=0,idiag_oumphi=0 integer :: idiag_ruxm=0,idiag_ruym=0,idiag_ruzm=0,idiag_rumax=0 integer :: idiag_uxmz=0,idiag_uymz=0,idiag_uzmz=0,idiag_umx=0 integer :: idiag_umy=0,idiag_umz=0,idiag_uxmxy=0,idiag_uymxy=0,idiag_uzmxy=0 integer :: idiag_Marms=0,idiag_Mamax=0,idiag_divu2m=0,idiag_epsK=0 integer :: idiag_urmphi=0,idiag_upmphi=0,idiag_uzmphi=0,idiag_u2mphi=0 integer :: idiag_phase1=0,idiag_phase2=0 integer :: idiag_ekintot=0, idiag_ekin=0 ! contains !*********************************************************************** subroutine register_hydro() ! ! Initialise variables which should know that we solve the hydro ! equations: iuu, etc; increase nvar accordingly. ! ! 6-nov-01/wolf: coded ! use Mpicomm, only: lroot use SharedVariables, only: put_shared_variable ! integer :: ierr ! ! Identify version number (generated automatically by SVN). ! if (lroot) call svn_id( & "$Id: nohydro.f90 13536 2010-03-25 15:15:47Z sven.bingert $") ! ! Share lpressuregradient_gas so Entropy module knows whether to apply ! pressure gradient or not. ! call put_shared_variable('lpressuregradient_gas',lpressuregradient_gas,ierr) if (ierr/=0) call fatal_error('register_hydro','there was a problem sharing lpressuregradient_gas') ! endsubroutine register_hydro !*********************************************************************** subroutine initialize_hydro(f,lstarting) ! ! Perform any post-parameter-read initialization i.e. calculate derived ! parameters. ! ! 24-nov-02/tony: coded ! use FArrayManager ! real, dimension (mx,my,mz,mfarray) :: f logical :: lstarting ! call keep_compiler_quiet(f) call keep_compiler_quiet(lstarting) ! endsubroutine initialize_hydro !*********************************************************************** subroutine init_uu(f) ! ! initialise uu and lnrho; called from start.f90 ! Should be located in the Hydro module, if there was one. ! ! 7-jun-02/axel: adapted from hydro ! real, dimension (mx,my,mz,mfarray) :: f ! call keep_compiler_quiet(f) ! endsubroutine init_uu !*********************************************************************** subroutine pencil_criteria_hydro() ! ! All pencils that the Hydro module depends on are specified here. ! ! 20-nov-04/anders: coded ! 1-jul-09/axel: added more for kinflow ! ! diagnostic pencils ! if (idiag_urms/=0 .or. idiag_umax/=0 .or. idiag_u2m/=0 .or. & idiag_um2/=0) lpenc_diagnos(i_u2)=.true. if (idiag_oum/=0) lpenc_diagnos(i_ou)=.true. ! endsubroutine pencil_criteria_hydro !*********************************************************************** subroutine pencil_interdep_hydro(lpencil_in) ! ! Interdependency among pencils from the Hydro module is specified here ! ! 20-nov-04/anders: coded ! logical, dimension (npencils) :: lpencil_in ! !ajwm May be overkill... Perhaps only needed for certain kinflow? if (lpencil_in(i_uglnrho)) then lpencil_in(i_uu)=.true. lpencil_in(i_glnrho)=.true. endif if (lpencil_in(i_ugrho)) then lpencil_in(i_uu)=.true. lpencil_in(i_grho)=.true. endif if (lpencil_in(i_uij5glnrho)) then lpencil_in(i_uij5)=.true. lpencil_in(i_glnrho)=.true. endif if (lpencil_in(i_u2)) lpencil_in(i_uu)=.true. ! oo if (lpencil_in(i_ou)) then lpencil_in(i_uu)=.true. lpencil_in(i_oo)=.true. endif ! endsubroutine pencil_interdep_hydro !*********************************************************************** subroutine calc_pencils_hydro(f,p) ! ! Calculate Hydro pencils. ! Most basic pencils should come first, as others may depend on them. ! ! 08-nov-04/tony: coded ! use Diagnostics, only: sum_mn_name, max_mn_name, integrate_mn_name use General, only: random_number_wrapper use Sub, only: quintic_step, quintic_der_step, dot_mn, dot2_mn ! real, dimension (mx,my,mz,mfarray) :: f type (pencil_case) :: p ! intent(in) :: f intent(inout) :: p ! if (lpencil(i_divu)) p%divu=0. ! if (lpencil(i_divu)) p%divu=0. ! u2 if (lpencil(i_u2)) call dot2_mn(p%uu,p%u2) if (idiag_ekin/=0 .or. idiag_ekintot/=0) then lpenc_diagnos(i_rho)=.true. lpenc_diagnos(i_u2)=.true. endif ! ou if (lpencil(i_ou)) call dot_mn(p%oo,p%uu,p%ou) ! ! Calculate maxima and rms values for diagnostic purposes ! if (ldiagnos) then if (idiag_urms/=0) call sum_mn_name(p%u2,idiag_urms,lsqrt=.true.) if (idiag_umax/=0) call max_mn_name(p%u2,idiag_umax,lsqrt=.true.) if (idiag_uzrms/=0) & call sum_mn_name(p%uu(:,3)**2,idiag_uzrms,lsqrt=.true.) if (idiag_uzmax/=0) & call max_mn_name(p%uu(:,3)**2,idiag_uzmax,lsqrt=.true.) if (idiag_u2m/=0) call sum_mn_name(p%u2,idiag_u2m) if (idiag_um2/=0) call max_mn_name(p%u2,idiag_um2) ! if (idiag_ekin/=0) call sum_mn_name(.5*p%rho*p%u2,idiag_ekin) if (idiag_ekintot/=0) & call integrate_mn_name(.5*p%rho*p%u2,idiag_ekintot) endif ! call keep_compiler_quiet(f) ! endsubroutine calc_pencils_hydro !*********************************************************************** subroutine duu_dt(df,p) ! ! velocity evolution, dummy routine ! ! 7-jun-02/axel: adapted from hydro ! use Diagnostics, only: sum_mn_name, save_name ! real, dimension (mx,my,mz,mvar) :: df type (pencil_case) :: p ! intent(in) :: df,p ! ! uu/dx for timestep (if kinflow is set) ! ! Calculate maxima and rms values for diagnostic purposes ! if (ldiagnos) then if (headtt.or.ldebug) print*,'duu_dt: diagnostics ...' if (idiag_oum/=0) call sum_mn_name(p%ou,idiag_oum) ! ! kinetic field components at one point (=pt) ! if (lroot.and.m==mpoint.and.n==npoint) then if (idiag_uxpt/=0) call save_name(p%uu(lpoint-nghost,1),idiag_uxpt) if (idiag_uypt/=0) call save_name(p%uu(lpoint-nghost,2),idiag_uypt) if (idiag_uzpt/=0) call save_name(p%uu(lpoint-nghost,3),idiag_uzpt) if (idiag_phase1/=0) call save_name(phase1,idiag_phase1) if (idiag_phase2/=0) call save_name(phase2,idiag_phase2) endif endif ! call keep_compiler_quiet(df) ! endsubroutine duu_dt !*********************************************************************** subroutine time_integrals_hydro(f,p) ! ! 1-jul-08/axel: dummy ! real, dimension (mx,my,mz,mfarray) :: f type (pencil_case) :: p ! intent(in) :: f,p ! call keep_compiler_quiet(f) call keep_compiler_quiet(p) ! endsubroutine time_integrals_hydro !*********************************************************************** subroutine coriolis_cartesian(df,uu,velind) ! ! coriolis terms for cartesian geometry ! ! 30-oct-09/MR: outsourced, parameter velind added ! checked to be an equivalent change by auot-test conv-slab-noequi, mdwarf ! real, dimension (mx,my,mz,mvar), intent(out) :: df real, dimension (nx,3), intent(in) :: uu integer, intent(in) :: velind ! call keep_compiler_quiet(df) call keep_compiler_quiet(uu) call keep_compiler_quiet(velind) ! endsubroutine coriolis_cartesian !*********************************************************************** subroutine calc_lhydro_pars(f) ! ! dummy routine ! real, dimension (mx,my,mz,mfarray) :: f intent(in) :: f ! call keep_compiler_quiet(f) ! endsubroutine calc_lhydro_pars !*********************************************************************** subroutine read_hydro_init_pars(unit,iostat) ! integer, intent(in) :: unit integer, intent(inout), optional :: iostat ! call keep_compiler_quiet(unit) if (present(iostat)) call keep_compiler_quiet(iostat) ! endsubroutine read_hydro_init_pars !*********************************************************************** subroutine write_hydro_init_pars(unit) ! integer, intent(in) :: unit ! call keep_compiler_quiet(unit) ! endsubroutine write_hydro_init_pars !*********************************************************************** subroutine read_hydro_run_pars(unit,iostat) ! integer, intent(in) :: unit integer, intent(inout), optional :: iostat ! call keep_compiler_quiet(unit) if (present(iostat)) call keep_compiler_quiet(iostat) ! endsubroutine read_hydro_run_pars !*********************************************************************** subroutine write_hydro_run_pars(unit) ! integer, intent(in) :: unit ! call keep_compiler_quiet(unit) ! endsubroutine write_hydro_run_pars !*********************************************************************** subroutine rprint_hydro(lreset,lwrite) ! ! reads and registers print parameters relevant for hydro part ! ! 8-jun-02/axel: adapted from hydro ! use Diagnostics ! integer :: iname logical :: lreset,lwr logical, optional :: lwrite ! lwr = .false. if (present(lwrite)) lwr=lwrite ! ! reset everything in case of reset ! (this needs to be consistent with what is defined above!) ! if (lreset) then idiag_u2m=0; idiag_um2=0; idiag_oum=0; idiag_o2m=0 idiag_uxpt=0; idiag_uypt=0; idiag_uzpt=0; idiag_dtu=0 idiag_urms=0; idiag_umax=0; idiag_uzrms=0; idiag_uzmax=0 idiag_phase1=0; idiag_phase2=0 idiag_orms=0; idiag_omax=0; idiag_oumphi=0 idiag_ruxm=0; idiag_ruym=0; idiag_ruzm=0; idiag_rumax=0 idiag_ux2m=0; idiag_uy2m=0; idiag_uz2m=0 idiag_uxuym=0; idiag_uxuzm=0; idiag_uyuzm=0 idiag_umx=0; idiag_umy=0; idiag_umz=0 idiag_Marms=0; idiag_Mamax=0; idiag_divu2m=0; idiag_epsK=0 idiag_urmphi=0; idiag_upmphi=0; idiag_uzmphi=0; idiag_u2mphi=0 idiag_ekin=0; idiag_ekintot=0 endif ! ! iname runs through all possible names that may be listed in print.in ! if (lroot.and.ip<14) print*,'rprint_hydro: run through parse list' do iname=1,nname call parse_name(iname,cname(iname),cform(iname),'ekin',idiag_ekin) call parse_name(iname,cname(iname),cform(iname),'ekintot',idiag_ekintot) call parse_name(iname,cname(iname),cform(iname),'u2m',idiag_u2m) call parse_name(iname,cname(iname),cform(iname),'um2',idiag_um2) call parse_name(iname,cname(iname),cform(iname),'o2m',idiag_o2m) call parse_name(iname,cname(iname),cform(iname),'oum',idiag_oum) call parse_name(iname,cname(iname),cform(iname),'dtu',idiag_dtu) call parse_name(iname,cname(iname),cform(iname),'urms',idiag_urms) call parse_name(iname,cname(iname),cform(iname),'umax',idiag_umax) call parse_name(iname,cname(iname),cform(iname),'uzrms',idiag_uzrms) call parse_name(iname,cname(iname),cform(iname),'uzmax',idiag_uzmax) call parse_name(iname,cname(iname),cform(iname),'ux2m',idiag_ux2m) call parse_name(iname,cname(iname),cform(iname),'uy2m',idiag_uy2m) call parse_name(iname,cname(iname),cform(iname),'uz2m',idiag_uz2m) call parse_name(iname,cname(iname),cform(iname),'uxuym',idiag_uxuym) call parse_name(iname,cname(iname),cform(iname),'uxuzm',idiag_uxuzm) call parse_name(iname,cname(iname),cform(iname),'uyuzm',idiag_uyuzm) call parse_name(iname,cname(iname),cform(iname),'orms',idiag_orms) call parse_name(iname,cname(iname),cform(iname),'omax',idiag_omax) call parse_name(iname,cname(iname),cform(iname),'ruxm',idiag_ruxm) call parse_name(iname,cname(iname),cform(iname),'ruym',idiag_ruym) call parse_name(iname,cname(iname),cform(iname),'ruzm',idiag_ruzm) call parse_name(iname,cname(iname),cform(iname),'rumax',idiag_rumax) call parse_name(iname,cname(iname),cform(iname),'umx',idiag_umx) call parse_name(iname,cname(iname),cform(iname),'umy',idiag_umy) call parse_name(iname,cname(iname),cform(iname),'umz',idiag_umz) call parse_name(iname,cname(iname),cform(iname),'Marms',idiag_Marms) call parse_name(iname,cname(iname),cform(iname),'Mamax',idiag_Mamax) call parse_name(iname,cname(iname),cform(iname),'divu2m',idiag_divu2m) call parse_name(iname,cname(iname),cform(iname),'epsK',idiag_epsK) call parse_name(iname,cname(iname),cform(iname),'uxpt',idiag_uxpt) call parse_name(iname,cname(iname),cform(iname),'uypt',idiag_uypt) call parse_name(iname,cname(iname),cform(iname),'uzpt',idiag_uzpt) call parse_name(iname,cname(iname),cform(iname),'phase1',idiag_phase1) call parse_name(iname,cname(iname),cform(iname),'phase2',idiag_phase2) enddo ! ! write column where which hydro variable is stored ! if (lwr) then write(3,*) 'i_ekin=',idiag_ekin write(3,*) 'i_ekintot=',idiag_ekintot write(3,*) 'i_u2m=',idiag_u2m write(3,*) 'i_um2=',idiag_um2 write(3,*) 'i_o2m=',idiag_o2m write(3,*) 'i_oum=',idiag_oum write(3,*) 'i_dtu=',idiag_dtu write(3,*) 'i_urms=',idiag_urms write(3,*) 'i_umax=',idiag_umax write(3,*) 'i_uzrms=',idiag_uzrms write(3,*) 'i_uzmax=',idiag_uzmax write(3,*) 'i_ux2m=',idiag_ux2m write(3,*) 'i_uy2m=',idiag_uy2m write(3,*) 'i_uz2m=',idiag_uz2m write(3,*) 'i_uxuym=',idiag_uxuym write(3,*) 'i_uxuzm=',idiag_uxuzm write(3,*) 'i_uyuzm=',idiag_uyuzm write(3,*) 'i_orms=',idiag_orms write(3,*) 'i_omax=',idiag_omax write(3,*) 'i_ruxm=',idiag_ruxm write(3,*) 'i_ruym=',idiag_ruym write(3,*) 'i_ruzm=',idiag_ruzm write(3,*) 'i_rumax=',idiag_rumax write(3,*) 'i_umx=',idiag_umx write(3,*) 'i_umy=',idiag_umy write(3,*) 'i_umz=',idiag_umz write(3,*) 'i_Marms=',idiag_Marms write(3,*) 'i_Mamax=',idiag_Mamax write(3,*) 'i_divu2m=',idiag_divu2m write(3,*) 'i_epsK=',idiag_epsK write(3,*) 'i_uxpt=',idiag_uxpt write(3,*) 'i_uypt=',idiag_uypt write(3,*) 'i_uzpt=',idiag_uzpt write(3,*) 'i_uxmz=',idiag_uxmz write(3,*) 'i_uymz=',idiag_uymz write(3,*) 'i_uzmz=',idiag_uzmz write(3,*) 'i_uxmxy=',idiag_uxmxy write(3,*) 'i_uymxy=',idiag_uymxy write(3,*) 'i_uzmxy=',idiag_uzmxy write(3,*) 'i_urmphi=',idiag_urmphi write(3,*) 'i_upmphi=',idiag_upmphi write(3,*) 'i_uzmphi=',idiag_uzmphi write(3,*) 'i_u2mphi=',idiag_u2mphi write(3,*) 'i_oumphi=',idiag_oumphi write(3,*) 'i_phase1=',idiag_phase1 write(3,*) 'i_phase2=',idiag_phase2 write(3,*) 'nname=',nname write(3,*) 'iuu=',iuu write(3,*) 'iux=',iux write(3,*) 'iuy=',iuy write(3,*) 'iuz=',iuz endif ! endsubroutine rprint_hydro !*********************************************************************** subroutine get_slices_hydro(f,slices) ! ! Write slices for animation of Hydro variables. ! ! 26-jun-06/tony: dummy ! real, dimension (mx,my,mz,mfarray) :: f type (slice_data) :: slices ! call keep_compiler_quiet(f) call keep_compiler_quiet(slices%ready) ! endsubroutine get_slices_hydro !*********************************************************************** endmodule Hydro