SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/modd_dstn.F90
Go to the documentation of this file.
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