<p><b>laura@ucar.edu</b> 2010-07-23 14:59:09 -0600 (Fri, 23 Jul 2010)</p><p>driver for parameterizations of cloud microphysics<br>
</p><hr noshade><pre><font color="gray">Added: branches/atmos_physics/src/core_physics/module_microphysics.F
===================================================================
--- branches/atmos_physics/src/core_physics/module_microphysics.F                                (rev 0)
+++ branches/atmos_physics/src/core_physics/module_microphysics.F        2010-07-23 20:59:09 UTC (rev 403)
@@ -0,0 +1,397 @@
+!=============================================================================================
+ module module_microphysics
+ use configure
+ use grid_types

+ use module_mp_kessler
+ use module_mp_thompson
+ use module_physics_constants
+ use module_physics_vars
+!#ifdef non_hydrostatic_core
+ use module_physics_interface_nhyd
+!#else
+!use module_physics_interface_hyd
+!#endif
+
+ implicit none
+ private
+ public:: microphysics_allocate,   &amp;
+          microphysics_deallocate, &amp;
+          microphysics_driver  ,   &amp;
+          microphysics_init
+
+ contains
+
+!=============================================================================================
+ subroutine microphysics_allocate
+!=============================================================================================
+
+!mass mixing ratios:
+ if(.not.allocated(qv_p)      ) allocate(qv_p(ims:ime,kms:kme,jms:jme) )
+ if(.not.allocated(qc_p)      ) allocate(qc_p(ims:ime,kms:kme,jms:jme) )
+ if(.not.allocated(qr_p)      ) allocate(qr_p(ims:ime,kms:kme,jms:jme) )
+
+ !surface precipitation:
+ if(.not.allocated(rainnc_p)  ) allocate(rainnc_p(ims:ime,jms:jme)     )
+ if(.not.allocated(rainncv_p) ) allocate(rainncv_p(ims:ime,jms:jme)    )
+
+ microp_select: select case(microp_scheme)
+
+    case (microp_thompson)
+
+       !mass mixing ratios:
+       if(.not.allocated(qi_p)         ) allocate(qi_p(ims:ime,kms:kme,jms:jme)  )
+       if(.not.allocated(qs_p)         ) allocate(qs_p(ims:ime,kms:kme,jms:jme)  )
+       if(.not.allocated(qg_p)         ) allocate(qg_p(ims:ime,kms:kme,jms:jme)  )
+
+       !number concentrations :
+       if(.not.allocated(qnr_p)        ) allocate(qnr_p(ims:ime,kms:kme,jms:jme) )
+       if(.not.allocated(qni_p)        ) allocate(qni_p(ims:ime,kms:kme,jms:jme) )
+
+       !surface precipitation:
+       if(.not.allocated(sr_p)         ) allocate(sr_p(ims:ime,jms:jme)          )
+       if(.not.allocated(snownc_p)     ) allocate(snownc_p(ims:ime,jms:jme)      )
+       if(.not.allocated(snowncv_p)    ) allocate(snowncv_p(ims:ime,jms:jme)     )
+       if(.not.allocated(graupelnc_p)  ) allocate(graupelnc_p(ims:ime,jms:jme)   )
+       if(.not.allocated(graupelncv_p) ) allocate(graupelncv_p(ims:ime,jms:jme)  )
+
+    case default
+
+ end select microp_select
+
+ end subroutine microphysics_allocate
+
+!=============================================================================================
+ subroutine microphysics_deallocate
+!=============================================================================================
+
+!mass mixing ratios:
+ if(allocated(qv_p)      ) deallocate(qv_p      )
+ if(allocated(qc_p)      ) deallocate(qc_p      )
+ if(allocated(qr_p)      ) deallocate(qr_p      )
+
+ !surface precipitation:
+ if(allocated(rainnc_p)  ) deallocate(rainnc_p  )
+ if(allocated(rainncv_p) ) deallocate(rainncv_p )
+
+ microp_select: select case(microp_scheme)
+
+    case (microp_thompson)
+
+       !mass mixing ratios:
+       if(allocated(qi_p)         ) deallocate(qi_p         )
+       if(allocated(qs_p)         ) deallocate(qs_p         )
+       if(allocated(qg_p)         ) deallocate(qg_p         )
+
+       !number concentrations:
+       if(allocated(qnr_p)        ) deallocate(qnr_p        )
+       if(allocated(qni_p)        ) deallocate(qni_p        )
+
+       !surface precipitation:
+       if(allocated(sr_p)         ) deallocate(sr_p         )
+       if(allocated(snownc_p)     ) deallocate(snownc_p     )
+       if(allocated(snowncv_p)    ) deallocate(snowncv_p    )
+       if(allocated(graupelnc_p)  ) deallocate(graupelnc_p  )
+       if(allocated(graupelncv_p) ) deallocate(graupelncv_p )
+
+    case default
+
+ end select microp_select
+
+ end subroutine microphysics_deallocate
+
+!=============================================================================================
+ subroutine microphysics_init
+!=============================================================================================
+
+ microp_select: select case(microp_scheme)
+
+    case (microp_thompson)
+       call thompson_init
+
+    case default
+
+ end select microp_select
+
+ end subroutine microphysics_init
+
+!=============================================================================================
+ subroutine microphysics_driver(tend,vars,grid,itimestep)
+!=============================================================================================
+
+!input arguments:
+!----------------
+ type(grid_meta),intent(in):: grid
+ integer,intent(in):: itimestep
+    
+!inout arguments:
+!----------------
+ type(grid_state),intent(inout):: tend,vars
+
+!local variables and arrays:
+!---------------------------
+ logical:: log_microphysics
+ integer:: ncells,ncellssolve,nlevels
+ integer:: i,icell,icount,istep,j,k,kk
+
+!=============================================================================================
+ write(6,*)
+ write(6,*) '--- enter subroutine microphysics_driver: itimestep=', itimestep
+ write(6,*) '    dt_microp=',dt_microp
+ write(6,*) '    n_microp =',n_microp

+ ncells      = grid%nCells
+ ncellssolve = grid%nCellsSolve
+ nlevels     = grid%nVertLevels
+  
+!initialization:
+ write(6,*) '    ims= ',ims,' ime=',ime
+ write(6,*) '    jms= ',jms,' jme=',jme
+ write(6,*) '    kms= ',kms,' kme=',kme
+ write(6,*)
+ write(6,*) '    ids= ',ids,' ide=',ide
+ write(6,*) '    jds= ',jds,' jde=',jde
+ write(6,*) '    kds= ',kds,' kde=',kde
+ write(6,*)
+ write(6,*) '    its= ',its,' ite=',ite
+ write(6,*) '    jts= ',jts,' jte=',jte
+ write(6,*) '    kts= ',kts,' kte=',kte
+ write(6,*)
+ write(6,*) '    its= ',its,' itf=',itf
+ write(6,*) '    jts= ',jts,' jtf=',jtf
+ write(6,*) '    kts= ',kts,' ktf=',ktf

+!---------------------------------------------------------------------------------------------
+
+!... initialization for precipitation:
+
+!---------------------------------------------------------------------------------------------
+
+ call precip_dyn_to_phys(vars, grid)
+
+!---------------------------------------------------------------------------------------------
+
+!... initialization is different for the non-hydrostatic and hydrostatic dynamical cores.
+
+!---------------------------------------------------------------------------------------------
+
+!#ifdef non_hydrostatic_core
+
+!non-hydrostatic dynamical core:
+ call microphysics_nhyd_to_phys(vars, grid)
+
+!#else
+
+ !hydrostatic dynamical core:
+ !call microphysics_hyd_to_phys(vars)
+
+!#endif
+
+!---------------------------------------------------------------------------------------------
+
+!... call to different cloud microphysics schemes:
+
+!---------------------------------------------------------------------------------------------
+
+ istep = 1
+
+ do while (istep .le. n_microp)
+
+    microp_select: select case(microp_scheme)
+
+       case (microp_kessler)
+
+!         call kessler( &amp;
+!                 th_phy    , qv_phy , qc_phy , qr_phy , rho_phy ,     pi_phy ,  &amp;
+!                 dt_microp ,  z_phy ,    xlv ,     cp ,    ep_2 ,     svp1   ,  &amp;
+!                      svp2 ,   svp3 ,  svpt0 ,  rho_w ,  dz_phy , rainnc_phy ,  &amp;
+!                   rainncv_phy ,                                                &amp;
+!                 ids,ide,jds,jde,kds,kde, &amp; ! domain dimensions
+!                 ims,ime,jms,jme,kms,kme, &amp; ! memory dimensions
+!                 its,itf,jts,jtf,kts,ktf)   ! tile dimensions
+!         write(6,*) '--- end microp_kessler:',istep
+
+       case (microp_thompson)
+
+          call mp_gt_driver( &amp;
+                  qv_p,qc_p,qr_p,qi_p,qs_p,qg_p,qni_p,                    &amp;
+                  qnr_p,th_p,pi_p,p_p,dz_p,dt_microp,itimestep,           &amp;
+                  rainnc_p,rainncv_p,snownc_p,snowncv_p,                  &amp;
+                  graupelnc_p,graupelncv_p,sr_p,                          &amp;
+!                 refl_10cm,grid_clock,grid_alarms,                       &amp;
+                  ids,ide,jds,jde,kds,kde, &amp; ! domain dimensions
+                  ims,ime,jms,jme,kms,kme, &amp; ! memory dimensions
+                  its,itf,jts,jtf,kts,ktf)   ! tile dimensions
+!         write(6,*) '--- end microp_thompson:',istep
+
+       case default
+
+    end select microp_select

+    istep = istep + 1
+    
+ end do
+
+!---------------------------------------------------------------------------------------------
+
+!... copy updated precipitation from the wrf-physics grid back to the geodesic-dynamics grid:
+
+!---------------------------------------------------------------------------------------------
+
+!call precip_phys_to_dyn(vars)
+
+!---------------------------------------------------------------------------------------------
+
+!... copy updated cloud microphysics variables from the wrf-physics grid back to the geodesic-
+!    dynamics grid:
+
+!---------------------------------------------------------------------------------------------
+
+!hydrostatic dynamical core:
+!call microphysics_phys_to_hyd(vars)
+
+ call microphysics_phys_to_nhyd(vars, grid, itimestep)
+
+!---------------------------------------------------------------------------------------------
+
+!... calculate tendency of potential temperature tendency due to cloud microphysics processes:
+
+!---------------------------------------------------------------------------------------------
+
+!do k = 1, nlevels
+!do icell = 1, ncellssolve
+
+!   vars % h_diabatic % array(k,icell) = &amp;
+!       (vars % theta % array(k,icell) - vars % h_diabatic % array(k,icell)) / dt_dyn
+
+!enddo
+!enddo
+
+!write(6,*) '--- end subroutine microphysics_driver:'
+!write(6,*)
+!do k = 1, nlevels
+!do i = 1, ncellssolve
+!   if(abs(vars % scalars % array(index_qc,k,i)) .gt. 0.) then
+!      write(6,201) i,k,vars % scalars % array(index_qv,k,i), &amp;
+!                   vars % scalars % array(index_qc,k,i),     &amp;
+!                   vars % scalars % array(index_qr,k,i)
+!   endif
+!enddo
+!enddo
+!stop
+
+!formats:
+ 201 format(2i6,10(1x,e15.8))
+ 203 format('microphysics begins:',3i6,2(1x,f6.1))
+ 204 format('microphysics precip:',3i6,8(1x,e15.8))
+
+ end subroutine microphysics_driver
+
+!=============================================================================================
+ subroutine precip_dyn_to_phys(vars, grid)
+!=============================================================================================
+
+!input variables:
+ type(grid_meta) ,intent(in):: grid
+
+!output variables:
+ type(grid_state),intent(out):: vars
+
+!local variables:
+ integer:: i,icell,j
+
+!---------------------------------------------------------------------------------------------
+
+!variables common to all cloud microphysics schemes:
+
+ do icell = 1, grid % ncellsSolve
+    vars % rainncv % array(icell)    = 0.
+ enddo
+
+ do j = jts, jtf
+ do i = its, itf
+    rainnc_p(i,j) = vars % rainnc % array(i)
+ enddo
+ enddo
+
+!variables specific to different cloud microphysics schemes:
+
+ microp_select_init: select case(microp_scheme)
+
+    case (microp_thompson)

+       do icell = 1, grid % nCellsSolve
+          vars % snowncv%array(icell)    = 0.
+          vars % graupelncv%array(icell) = 0.
+          vars % sr%array(icell)         = 0.
+       enddo 
+
+       do j = jts, jtf
+       do i = its, itf
+          snownc_p(i,j)    = vars % snownc % array(i)
+          graupelnc_p(i,j) = vars % graupelnc % array(i)
+       enddo
+       enddo
+
+    case default
+
+ end select microp_select_init
+
+ end subroutine precip_dyn_to_phys
+
+!=============================================================================================
+ subroutine precip_phys_to_dyn(vars)
+!=============================================================================================
+
+!output variables:
+ type(grid_state),intent(out):: vars
+
+!local variables:
+ integer:: i,j
+
+!---------------------------------------------------------------------------------------------
+
+!variables common to all cloud microphysics schemes:
+
+ do j = jts,jtf
+ do i = its,itf
+
+    !time-step precipitation:
+    vars % rainncv % array(i) = rainncv_p(i,j)
+    
+    !accumulated precipitation:
+    vars % rainnc % array(i) = rainnc_p(i,j)
+    
+ enddo
+ enddo
+
+!variables specific to different cloud microphysics schemes:
+
+ microp_select_init: select case(microp_scheme)
+
+    case (microp_thompson)
+
+       do j = jts,jtf
+       do i = its,itf
+       
+          !time-step precipitation:
+          vars % snowncv % array(i)    = snowncv_p(i,j)
+          vars % graupelncv % array(i) = graupelncv_p(i,j)
+          vars % sr % array(i)         = sr_p(i,j)
+
+          !accumulated precipitation:
+          vars % snownc % array(i) = snownc_p(i,j)
+          vars % graupelnc % array(i) = graupelnc_p(i,j)
+
+       enddo
+       enddo
+
+    case default
+
+ end select microp_select_init
+
+ end subroutine precip_phys_to_dyn
+
+!=============================================================================================
+ end module module_microphysics
+!=============================================================================================

</font>
</pre>