! $Id$ ! ! Parametric instability with a time-dependent forcing ! ! 29-jun-2009/dintrans: adapted from oscillation_0D.f90 ! !** AUTOMATIC CPARAM.INC GENERATION **************************** ! Declare (for generation of special_dummies.inc) the number of f array ! variables and auxiliary variables added by this module ! ! CPARAM logical, parameter :: lspecial = .true. ! ! MVAR CONTRIBUTION 2 ! MAUX CONTRIBUTION 0 ! !*************************************************************** ! module Special ! use Cparam use Cdata use General, only: keep_compiler_quiet use Messages ! implicit none ! include '../special.h' ! ! Declare index of variables ! integer :: ispecial=0, ispecial1=0, ispecial2=0 ! ! input parameters real :: eps=0., w_ff=0., u1ini=0., u2ini=0. character(len=50) :: init='zero' namelist /special_init_pars/ init, u1ini, u2ini ! ! run parameters namelist /special_run_pars/ eps, w_ff ! ! other variables (needs to be consistent with reset list below) ! integer :: idiag_u1=0, idiag_u2=0 ! contains ! !*********************************************************************** subroutine register_special() ! ! Configure pre-initialised (i.e. before parameter read) variables ! which should be know to be able to evaluate ! ! 6-oct-03/tony: coded ! use FArrayManager ! ! Identify CVS/SVN version information. ! if (lroot) call svn_id( & "$Id$") ! call farray_register_pde('ispecial',ispecial,array=2) ispecial1=ispecial ispecial2=ispecial+1 ! endsubroutine register_special !*********************************************************************** subroutine initialize_special(f) ! ! called by run.f90 after reading parameters, but before the time loop ! ! 06-oct-03/tony: coded ! real, dimension (mx,my,mz,mfarray) :: f ! ! Initialize any module variables which are parameter dependent ! call keep_compiler_quiet(f) ! endsubroutine initialize_special !*********************************************************************** subroutine init_special(f) ! ! initialise special condition; called from start.f90 ! 06-oct-2003/tony: coded ! use Mpicomm use Sub ! real, dimension (mx,my,mz,mfarray) :: f ! intent(inout) :: f ! ! initial condition ! select case (init) case ('nothing'); if (lroot) print*,'init_special: nothing' case ('zero'); f(:,:,:,ispecial1)=0.; f(:,:,:,ispecial2)=0. case ('set'); f(:,:,:,ispecial1)=u1ini; f(:,:,:,ispecial2)=u2ini case default ! ! Catch unknown values ! if (lroot) print*,'init_special: No such value for init: ', trim(init) call stop_it("") endselect ! endsubroutine init_special !*********************************************************************** subroutine pencil_criteria_special() ! ! All pencils that this special module depends on are specified here. ! ! 18-07-06/tony: coded ! endsubroutine pencil_criteria_special !*********************************************************************** subroutine pencil_interdep_special(lpencil_in) ! ! Interdependency among pencils provided by this module are specified here. ! ! 18-07-06/tony: coded ! logical, dimension(npencils) :: lpencil_in ! call keep_compiler_quiet(lpencil_in) ! endsubroutine pencil_interdep_special !*********************************************************************** subroutine calc_pencils_special(f,p) ! ! Calculate Hydro pencils. ! Most basic pencils should come first, as others may depend on them. ! ! 24-nov-04/tony: coded ! real, dimension (mx,my,mz,mfarray) :: f type (pencil_case) :: p ! intent(in) :: f intent(inout) :: p ! call keep_compiler_quiet(f) call keep_compiler_quiet(p) ! endsubroutine calc_pencils_special !*********************************************************************** subroutine dspecial_dt(f,df,p) ! ! calculate right hand side of ONE OR MORE extra coupled PDEs ! along the 'current' Pencil, i.e. f(l1:l2,m,n) where ! m,n are global variables looped over in equ.f90 ! ! Due to the multi-step Runge Kutta timestepping used one MUST always ! add to the present contents of the df array. NEVER reset it to zero. ! ! several precalculated Pencils of information are passed if for ! efficiency. ! ! 06-oct-03/tony: coded ! use Diagnostics use Mpicomm use Sub ! real, dimension (mx,my,mz,mfarray) :: f real, dimension (mx,my,mz,mvar) :: df real, dimension (nx) :: u1,u2 type (pencil_case) :: p ! intent(in) :: f,p intent(inout) :: df ! call keep_compiler_quiet(p) ! ! identify module and boundary conditions ! if (headtt.or.ldebug) print*,'dspecial_dt: SOLVE dSPECIAL_dt', eps, w_ff ! ! Solve the equations: ! du1/dt = -u2*(1+eps*cos(2*w_ff*t)) ! du2/dt = u1 ! u1=f(l1:l2,m,n,ispecial1) u2=f(l1:l2,m,n,ispecial2) ! df(l1:l2,m,n,ispecial1)=df(l1:l2,m,n,ispecial1)- & u2*(1.+eps*cos(2.*w_ff*t)) df(l1:l2,m,n,ispecial2)=df(l1:l2,m,n,ispecial2)+u1 ! ! diagnostics ! if (ldiagnos) then if (lroot.and.m==mpoint.and.n==npoint) then if (idiag_u1/=0) call save_name(u1(lpoint-nghost),idiag_u1) if (idiag_u2/=0) call save_name(u2(lpoint-nghost),idiag_u2) endif endif ! endsubroutine dspecial_dt !*********************************************************************** subroutine read_special_init_pars(iostat) ! use File_io, only: parallel_unit ! integer, intent(out) :: iostat ! read(parallel_unit, NML=special_init_pars, IOSTAT=iostat) ! endsubroutine read_special_init_pars !*********************************************************************** subroutine write_special_init_pars(unit) ! integer, intent(in) :: unit ! write(unit, NML=special_init_pars) ! endsubroutine write_special_init_pars !*********************************************************************** subroutine read_special_run_pars(iostat) ! use File_io, only: parallel_unit ! integer, intent(out) :: iostat ! read(parallel_unit, NML=special_run_pars, IOSTAT=iostat) ! endsubroutine read_special_run_pars !*********************************************************************** subroutine write_special_run_pars(unit) ! integer, intent(in) :: unit ! write(unit, NML=special_run_pars) ! endsubroutine write_special_run_pars !*********************************************************************** subroutine rprint_special(lreset,lwrite) ! ! reads and registers print parameters relevant to special ! ! 06-oct-03/tony: coded ! use Diagnostics use FArrayManager, only: farray_index_append use Sub ! ! SAMPLE IMPLEMENTATION ! 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_u1=0; idiag_u2=0 endif ! do iname=1,nname call parse_name(iname,cname(iname),cform(iname),'u1',idiag_u1) call parse_name(iname,cname(iname),cform(iname),'u2',idiag_u2) enddo ! ! write column where which variable is stored ! if (lwr) then call farray_index_append('i_u1',idiag_u1) call farray_index_append('i_u2',idiag_u2) endif ! endsubroutine rprint_special !*********************************************************************** ! !******************************************************************** !************ DO NOT DELETE THE FOLLOWING ************** !******************************************************************** !** This is an automatically generated include file that creates ** !** copies dummy routines from nospecial.f90 for any Special ** !** routines not implemented in this file ** !** ** include 'special_dummies.inc' !******************************************************************** endmodule Special