SURFEX v7.3
General documentation of Surfex
|
00001 MODULE MODD_DST_n 00002 00003 !Purpose: 00004 !Declare variables and constants necessary to do the dust calculations 00005 !Here are only the variables which depend on the grid! 00006 00007 !Author: Alf Grini <alf.grini@cnrm.meteo.fr> 00008 00009 ! 00010 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00011 USE PARKIND1 ,ONLY : JPRB 00012 ! 00013 IMPLICIT NONE 00014 00015 TYPE DST_t 00016 ! 00017 ! 00018 INTEGER, DIMENSION(:), POINTER :: NVT_DST=>NULL() !MASK: dust vegetation number to vegetation number 00019 INTEGER, DIMENSION(:,:), POINTER :: NSIZE_PATCH_DST=>NULL() !Number of points for a patch and a vegetation class 00020 INTEGER, DIMENSION(:,:,:), POINTER :: NR_PATCH_DST=>NULL() !Mask from patch-points to dust-points 00021 REAL,DIMENSION(:), POINTER :: Z0_EROD_DST=>NULL() !Roughness length momentum over erodible dust emitter sfc 00022 CHARACTER(LEN=6), DIMENSION(:), POINTER :: CSV_DST =>NULL() !Name of scalar variables 00023 REAL, DIMENSION(:,:,:),POINTER :: XSFDST=>NULL() !Dust variables to be send to output 00024 REAL, DIMENSION(:,:,:),POINTER :: XSFDSTM=>NULL() !Dust variables to be send to output 00025 REAL,DIMENSION(:), POINTER :: XEMISRADIUS_DST =>NULL() !Number median radius for each source mode 00026 REAL,DIMENSION(:), POINTER :: XEMISSIG_DST =>NULL() !sigma for each source mode 00027 REAL,DIMENSION(:), POINTER :: XMSS_FRC_SRC =>NULL() !Mass fraction of each source mode 00028 END TYPE DST_t 00029 00030 TYPE(DST_t), ALLOCATABLE, TARGET, SAVE :: DST_MODEL(:) 00031 00032 INTEGER, DIMENSION(:), POINTER :: NVT_DST=>NULL() 00033 !$OMP THREADPRIVATE(NVT_DST) 00034 INTEGER, DIMENSION(:,:), POINTER :: NSIZE_PATCH_DST=>NULL() 00035 !$OMP THREADPRIVATE(NSIZE_PATCH_DST) 00036 INTEGER, DIMENSION(:,:,:), POINTER :: NR_PATCH_DST=>NULL() 00037 !$OMP THREADPRIVATE(NR_PATCH_DST) 00038 REAL,DIMENSION(:), POINTER :: Z0_EROD_DST=>NULL() 00039 !$OMP THREADPRIVATE(Z0_EROD_DST) 00040 CHARACTER(LEN=6), DIMENSION(:), POINTER :: CSV_DST=>NULL() 00041 !$OMP THREADPRIVATE(CSV_DST) 00042 REAL, DIMENSION(:,:,:),POINTER :: XSFDST=>NULL() 00043 !$OMP THREADPRIVATE(XSFDST) 00044 REAL, DIMENSION(:,:,:),POINTER :: XSFDSTM=>NULL() 00045 !$OMP THREADPRIVATE(XSFDSTM) 00046 REAL,DIMENSION(:), POINTER :: XEMISRADIUS_DST=>NULL() 00047 !$OMP THREADPRIVATE(XEMISRADIUS_DST) 00048 REAL,DIMENSION(:), POINTER :: XEMISSIG_DST=>NULL() 00049 !$OMP THREADPRIVATE(XEMISSIG_DST) 00050 REAL,DIMENSION(:), POINTER :: XMSS_FRC_SRC=>NULL() 00051 !$OMP THREADPRIVATE(XMSS_FRC_SRC) 00052 00053 CONTAINS 00054 00055 SUBROUTINE DST_GOTO_MODEL(KFROM, KTO, LKFROM) 00056 LOGICAL, INTENT(IN) :: LKFROM 00057 INTEGER, INTENT(IN) :: KFROM, KTO 00058 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00059 ! 00060 ! Save current state for allocated arrays 00061 IF (LKFROM) THEN 00062 DST_MODEL(KFROM)%NVT_DST=>NVT_DST 00063 DST_MODEL(KFROM)%NSIZE_PATCH_DST=>NSIZE_PATCH_DST 00064 DST_MODEL(KFROM)%NR_PATCH_DST=>NR_PATCH_DST 00065 DST_MODEL(KFROM)%Z0_EROD_DST=>Z0_EROD_DST 00066 DST_MODEL(KFROM)%CSV_DST=>CSV_DST 00067 DST_MODEL(KFROM)%XSFDST=>XSFDST 00068 DST_MODEL(KFROM)%XSFDSTM=>XSFDSTM 00069 DST_MODEL(KFROM)%XEMISRADIUS_DST=>XEMISRADIUS_DST 00070 DST_MODEL(KFROM)%XEMISSIG_DST=>XEMISSIG_DST 00071 DST_MODEL(KFROM)%XMSS_FRC_SRC=>XMSS_FRC_SRC 00072 ENDIF 00073 ! 00074 ! Current model is set to model KTO 00075 IF (LHOOK) CALL DR_HOOK('MODD_DST_N:DST_GOTO_MODEL',0,ZHOOK_HANDLE) 00076 NVT_DST=>DST_MODEL(KTO)%NVT_DST 00077 NSIZE_PATCH_DST=>DST_MODEL(KTO)%NSIZE_PATCH_DST 00078 NR_PATCH_DST=>DST_MODEL(KTO)%NR_PATCH_DST 00079 Z0_EROD_DST=>DST_MODEL(KTO)%Z0_EROD_DST 00080 CSV_DST=>DST_MODEL(KTO)%CSV_DST 00081 XSFDST=>DST_MODEL(KTO)%XSFDST 00082 XSFDSTM=>DST_MODEL(KTO)%XSFDSTM 00083 XEMISRADIUS_DST=>DST_MODEL(KTO)%XEMISRADIUS_DST 00084 XEMISSIG_DST=>DST_MODEL(KTO)%XEMISSIG_DST 00085 XMSS_FRC_SRC=>DST_MODEL(KTO)%XMSS_FRC_SRC 00086 IF (LHOOK) CALL DR_HOOK('MODD_DST_N:DST_GOTO_MODEL',1,ZHOOK_HANDLE) 00087 00088 END SUBROUTINE DST_GOTO_MODEL 00089 00090 SUBROUTINE DST_ALLOC(KMODEL) 00091 INTEGER, INTENT(IN) :: KMODEL 00092 INTEGER :: J 00093 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00094 IF (LHOOK) CALL DR_HOOK("MODD_DST_N:DST_ALLOC",0,ZHOOK_HANDLE) 00095 ALLOCATE(DST_MODEL(KMODEL)) 00096 DO J=1,KMODEL 00097 NULLIFY(DST_MODEL(J)%NVT_DST) 00098 NULLIFY(DST_MODEL(J)%NSIZE_PATCH_DST) 00099 NULLIFY(DST_MODEL(J)%NR_PATCH_DST) 00100 NULLIFY(DST_MODEL(J)%Z0_EROD_DST) 00101 NULLIFY(DST_MODEL(J)%CSV_DST) 00102 NULLIFY(DST_MODEL(J)%XSFDST) 00103 NULLIFY(DST_MODEL(J)%XSFDSTM) 00104 NULLIFY(DST_MODEL(J)%XEMISRADIUS_DST) 00105 NULLIFY(DST_MODEL(J)%XEMISSIG_DST) 00106 NULLIFY(DST_MODEL(J)%XMSS_FRC_SRC) 00107 ENDDO 00108 IF (LHOOK) CALL DR_HOOK("MODD_DST_N:DST_ALLOC",1,ZHOOK_HANDLE) 00109 END SUBROUTINE DST_ALLOC 00110 00111 SUBROUTINE DST_DEALLO 00112 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00113 IF (LHOOK) CALL DR_HOOK("MODD_DST_N:DST_DEALLO",0,ZHOOK_HANDLE) 00114 IF (ALLOCATED(DST_MODEL)) DEALLOCATE(DST_MODEL) 00115 IF (LHOOK) CALL DR_HOOK("MODD_DST_N:DST_DEALLO",1,ZHOOK_HANDLE) 00116 END SUBROUTINE DST_DEALLO 00117 00118 END MODULE MODD_DST_n