!WRF:MEDIATION_LAYER:couple_uncouple_utility SUBROUTINE couple_or_uncouple_em ( grid , config_flags , couple & ! #include "em_dummy_new_args.inc" ! ) ! #undef DM_PARALLEL ! Driver layer modules USE module_domain USE module_configure USE module_driver_constants USE module_machine USE module_tiles USE module_dm USE module_bc ! Mediation layer modules ! Registry generated module USE module_state_description IMPLICIT NONE ! Subroutine interface block. TYPE(domain) , TARGET :: grid ! Definitions of dummy arguments to solve #include ! WRF state bcs TYPE (grid_config_rec_type) , INTENT(IN) :: config_flags LOGICAL, INTENT( IN) :: couple ! Local data INTEGER :: k_start , k_end INTEGER :: ids , ide , jds , jde , kds , kde , & ims , ime , jms , jme , kms , kme , & ips , ipe , jps , jpe , kps , kpe INTEGER :: i,j,k, im INTEGER :: num_3d_c, num_3d_m, num_3d_s REAL :: mu_factor REAL, DIMENSION(grid%sm31:grid%em31,grid%sm33:grid%em33) :: mut_2, muut_2, muvt_2, muwt_2 ! De-reference dimension information stored in the grid data structure. CALL get_ijk_from_grid ( grid , & ids, ide, jds, jde, kds, kde, & ims, ime, jms, jme, kms, kme, & ips, ipe, jps, jpe, kps, kpe ) num_3d_m = num_moist num_3d_c = num_chem num_3d_s = num_scalar ! couple or uncouple mass-point variables ! first, compute mu or its reciprical as necessary ! write(6,*) ' in couple ' ! write(6,*) ' x,y memory ', grid%sm31,grid%em31,grid%sm33,grid%em33 ! write(6,*) ' x,y patch ', ips, ipe, jps, jpe ! if(couple) then ! write(6,*) ' coupling variables for grid ',grid%id ! write(6,*) ' ips, ipe, jps, jpe ',ips,ipe,jps,jpe ! else ! write(6,*) ' uncoupling variables for grid ',grid%id ! write(6,*) ' ips, ipe, jps, jpe ',ips,ipe,jps,jpe ! write(6,*) ' x, y, size ',size(mu_2,1),size(mu_2,2) ! end if #ifdef DM_PARALLEL # include #endif IF ( config_flags%periodic_x .OR. config_flags%periodic_y ) THEN CALL set_physical_bc2d( grid%em_mub, 't', & config_flags, & ids,ide, jds,jde, & ! domain dims ims,ime, jms,jme, & ! memory dims ips,ipe, jps,jpe, & ! patch dims ips,ipe, jps,jpe ) CALL set_physical_bc2d( grid%em_mu_1, 't', & config_flags, & ids,ide, jds,jde, & ! domain dims ims,ime, jms,jme, & ! memory dims ips,ipe, jps,jpe, & ! patch dims ips,ipe, jps,jpe ) CALL set_physical_bc2d( grid%em_mu_2, 't', & config_flags, & ids,ide, jds,jde, & ! domain dims ims,ime, jms,jme, & ! memory dims ips,ipe, jps,jpe, & ! patch dims ips,ipe, jps,jpe ) ENDIF #ifdef DM_PARALLEL # include "HALO_EM_COUPLE_A.inc" # include "PERIOD_EM_COUPLE_A.inc" #endif ! computations go out one row and column to avoid having to communicate before solver IF( couple ) THEN ! write(6,*) ' coupling: setting mu arrays ' DO j = max(jds,jps),min(jde-1,jpe) DO i = max(ids,ips),min(ide-1,ipe) mut_2(i,j) = grid%em_mub(i,j) + grid%em_mu_2(i,j) muwt_2(i,j) = (grid%em_mub(i,j) + grid%em_mu_2(i,j))/grid%msft(i,j) ENDDO ENDDO ! need boundary condition fixes for u and v ??? ! write(6,*) ' coupling: setting muv and muv arrays ' DO j = max(jds,jps),min(jde-1,jpe) DO i = max(ids,ips),min(ide-1,ipe) muut_2(i,j) = 0.5*(grid%em_mub(i,j)+grid%em_mub(i-1,j) + grid%em_mu_2(i,j) + grid%em_mu_2(i-1,j))/grid%msfu(i,j) muvt_2(i,j) = 0.5*(grid%em_mub(i,j)+grid%em_mub(i,j-1) + grid%em_mu_2(i,j) + grid%em_mu_2(i,j-1))/grid%msfv(i,j) ENDDO ENDDO IF ( config_flags%nested .or. config_flags%specified ) THEN IF ( jpe .eq. jde ) THEN j = jde DO i = max(ids,ips),min(ide-1,ipe) muvt_2(i,j) = (grid%em_mub(i,j-1) + grid%em_mu_2(i,j-1))/grid%msfv(i,j) ENDDO ENDIF IF ( ipe .eq. ide .AND. .NOT. config_flags%periodic_x ) THEN i = ide DO j = max(jds,jps),min(jde-1,jpe) muut_2(i,j) = (grid%em_mub(i-1,j) + grid%em_mu_2(i-1,j))/grid%msfu(i,j) ENDDO ENDIF ELSE IF ( jpe .eq. jde ) THEN j = jde DO i = max(ids,ips),min(ide-1,ipe) muvt_2(i,j) = 0.5*(grid%em_mub(i,j)+grid%em_mub(i,j-1) + grid%em_mu_2(i,j) + grid%em_mu_2(i,j-1))/grid%msfv(i,j) ENDDO ENDIF IF ( ipe .eq. ide ) THEN i = ide DO j = max(jds,jps),min(jde-1,jpe) muut_2(i,j) = 0.5*(grid%em_mub(i,j)+grid%em_mub(i-1,j) + grid%em_mu_2(i,j) + grid%em_mu_2(i-1,j))/grid%msfu(i,j) ENDDO ENDIF END IF ELSE ! write(6,*) ' uncoupling: setting mu arrays ' DO j = max(jds,jps),min(jde-1,jpe) DO i = max(ids,ips),min(ide-1,ipe) mut_2(i,j) = 1./(grid%em_mub(i,j) + grid%em_mu_2(i,j)) muwt_2(i,j) = grid%msft(i,j)/(grid%em_mub(i,j) + grid%em_mu_2(i,j)) ENDDO ENDDO ! write(6,*) ' uncoupling: setting muv arrays ' DO j = max(jds,jps),min(jde-1,jpe) DO i = max(ids,ips),min(ide-1,ipe) muut_2(i,j) = 2.*grid%msfu(i,j)/(grid%em_mub(i,j)+grid%em_mub(i-1,j) + grid%em_mu_2(i,j) + grid%em_mu_2(i-1,j)) ENDDO ENDDO DO j = max(jds,jps),min(jde-1,jpe) DO i = max(ids,ips),min(ide-1,ipe) muvt_2(i,j) = 2.*grid%msfv(i,j)/(grid%em_mub(i,j)+grid%em_mub(i,j-1) + grid%em_mu_2(i,j) + grid%em_mu_2(i,j-1)) ENDDO ENDDO IF ( config_flags%nested .or. config_flags%specified ) THEN IF ( jpe .eq. jde ) THEN j = jde DO i = max(ids,ips),min(ide-1,ipe) muvt_2(i,j) = grid%msfv(i,j)/(grid%em_mub(i,j-1) + grid%em_mu_2(i,j-1)) ENDDO ENDIF IF ( ipe .eq. ide .AND. .NOT. config_flags%periodic_x ) THEN i = ide DO j = max(jds,jps),min(jde-1,jpe) muut_2(i,j) = grid%msfu(i,j)/(grid%em_mub(i-1,j) + grid%em_mu_2(i-1,j)) ENDDO ENDIF ELSE IF ( jpe .eq. jde ) THEN j = jde DO i = max(ids,ips),min(ide-1,ipe) muvt_2(i,j) = 2.*grid%msfv(i,j)/(grid%em_mub(i,j)+grid%em_mub(i,j-1) + grid%em_mu_2(i,j) + grid%em_mu_2(i,j-1)) ENDDO ENDIF IF ( ipe .eq. ide ) THEN i = ide DO j = max(jds,jps),min(jde-1,jpe) muut_2(i,j) = 2.*grid%msfu(i,j)/(grid%em_mub(i,j)+grid%em_mub(i-1,j) + grid%em_mu_2(i,j) + grid%em_mu_2(i-1,j)) ENDDO ENDIF END IF END IF ! couple/uncouple mu point variables !$OMP PARALLEL DO & !$OMP PRIVATE ( i,j,k,im ) DO j = max(jds,jps),min(jde-1,jpe) DO k = kps,kpe DO i = max(ids,ips),min(ide-1,ipe) grid%em_ph_2(i,k,j) = grid%em_ph_2(i,k,j)*mut_2(i,j) grid%em_w_2(i,k,j) = grid%em_w_2(i,k,j)*muwt_2(i,j) ENDDO ENDDO DO k = kps,kpe-1 DO i = max(ids,ips),min(ide-1,ipe) grid%em_t_2(i,k,j) = grid%em_t_2(i,k,j)*mut_2(i,j) ENDDO ENDDO IF (num_3d_m >= PARAM_FIRST_SCALAR ) THEN DO im = PARAM_FIRST_SCALAR, num_3d_m DO k = kps,kpe-1 DO i = max(ids,ips),min(ide-1,ipe) moist(i,k,j,im) = moist(i,k,j,im)*mut_2(i,j) ENDDO ENDDO ENDDO END IF IF (num_3d_c >= PARAM_FIRST_SCALAR ) THEN DO im = PARAM_FIRST_SCALAR, num_3d_c DO k = kps,kpe-1 DO i = max(ids,ips),min(ide-1,ipe) chem(i,k,j,im) = chem(i,k,j,im)*mut_2(i,j) ENDDO ENDDO ENDDO END IF IF (num_3d_s >= PARAM_FIRST_SCALAR ) THEN DO im = PARAM_FIRST_SCALAR, num_3d_s DO k = kps,kpe-1 DO i = max(ids,ips),min(ide-1,ipe) scalar(i,k,j,im) = scalar(i,k,j,im)*mut_2(i,j) ENDDO ENDDO ENDDO END IF ! do u and v DO k = kps,kpe-1 DO i = max(ids,ips),min(ide,ipe) grid%em_u_2(i,k,j) = grid%em_u_2(i,k,j)*muut_2(i,j) ENDDO ENDDO ENDDO ! j loop !$OMP END PARALLEL DO !$OMP PARALLEL DO & !$OMP PRIVATE ( i,j,k ) DO j = max(jds,jps),min(jde,jpe) DO k = kps,kpe-1 DO i = max(ids,ips),min(ide-1,ipe) grid%em_v_2(i,k,j) = grid%em_v_2(i,k,j)*muvt_2(i,j) ENDDO ENDDO ENDDO !$OMP END PARALLEL DO IF ( config_flags%periodic_x .OR. config_flags%periodic_y ) THEN CALL set_physical_bc3d( grid%em_ph_1, 'w', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) CALL set_physical_bc3d( grid%em_ph_2, 'w', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) CALL set_physical_bc3d( grid%em_w_1, 'w', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) CALL set_physical_bc3d( grid%em_w_2, 'w', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) CALL set_physical_bc3d( grid%em_t_1, 't', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) CALL set_physical_bc3d( grid%em_t_2, 't', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) CALL set_physical_bc3d( grid%em_u_1, 'u', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) CALL set_physical_bc3d( grid%em_u_2, 'u', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) CALL set_physical_bc3d( grid%em_v_1, 'v', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) CALL set_physical_bc3d( grid%em_v_2, 'v', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) IF (num_3d_m >= PARAM_FIRST_SCALAR) THEN DO im = PARAM_FIRST_SCALAR , num_3d_m CALL set_physical_bc3d( moist(ims,kms,jms,im), 'p', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) ENDDO ENDIF IF (num_3d_c >= PARAM_FIRST_SCALAR) THEN DO im = PARAM_FIRST_SCALAR , num_3d_c CALL set_physical_bc3d( chem(ims,kms,jms,im), 'p', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) ENDDO ENDIF IF (num_3d_s >= PARAM_FIRST_SCALAR) THEN DO im = PARAM_FIRST_SCALAR , num_3d_s CALL set_physical_bc3d( scalar(ims,kms,jms,im), 'p', & config_flags, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims ips,ipe, jps,jpe, kps,kpe, & ! patch dims ips,ipe, jps,jpe, kps,kpe ) ENDDO ENDIF ENDIF #ifdef DM_PARALLEL # include "HALO_EM_COUPLE_B.inc" # include "PERIOD_EM_COUPLE_B.inc" #endif END SUBROUTINE couple_or_uncouple_em LOGICAL FUNCTION em_cd_feedback_mask( pig, ips_save, ipe_save , pjg, jps_save, jpe_save, xstag, ystag ) USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: pig, ips_save, ipe_save , pjg, jps_save, jpe_save LOGICAL, INTENT(IN) :: xstag, ystag INTEGER ioff, joff, spec_zone CALL nl_get_spec_zone( 1, spec_zone ) ioff = 0 ; joff = 0 IF ( xstag ) ioff = 1 IF ( ystag ) joff = 1 em_cd_feedback_mask = ( pig .ge. ips_save+spec_zone .and. & pjg .ge. jps_save+spec_zone .and. & pig .le. ipe_save-spec_zone +ioff .and. & pjg .le. jpe_save-spec_zone +joff ) END FUNCTION em_cd_feedback_mask