SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/modd_oceann.F90
Go to the documentation of this file.
00001 !     #################
00002       MODULE MODD_OCEAN_n
00003 !     #################
00004 !
00005 !!****  *MODD_OCEAN_n - declaration of ocean varaiables 
00006 !!                          for 1D oceanic model
00007 !!
00008 !!    PURPOSE
00009 !!    -------
00010 !     Declaration of ocean varaiables
00011 !
00012 !!
00013 !!**  IMPLICIT ARGUMENTS
00014 !!    ------------------
00015 !!      None 
00016 !!
00017 !!    REFERENCE
00018 !!    ---------
00019 !!
00020 !!    AUTHOR
00021 !!    ------
00022 !!      C. Lebeaupin   *Meteo France*
00023 !!
00024 !!    MODIFICATIONS
00025 !!    -------------
00026 !!      Original       04/2006
00027 !!      Modified       07/2012, P. Le Moigne : CMO1D phasing
00028 !
00029 !*       0.   DECLARATIONS
00030 !             ------------
00031 !
00032 !
00033 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00034 USE PARKIND1  ,ONLY : JPRB
00035 !
00036 IMPLICIT NONE
00037 !
00038 TYPE OCEAN_t
00039 !
00040 !
00041 !   Switche for interactive coupling with oceanic model
00042 LOGICAL:: LMERCATOR   !set to .true. to initialize oceanic var. from Mercator
00043 LOGICAL:: LCURRENT    !set to .true. to make initialize ocean state with current      
00044 LOGICAL:: LPROGSST    !set to .true. to make SST evolve with tendance
00045 INTEGER:: NTIME_COUPLING! coupling time frequency 
00046 INTEGER:: NOCTCOUNT   !oceanic model counter
00047 ! General surface: 
00048 !
00049 REAL, POINTER, DIMENSION(:,:) :: XSEAT  ! oceanic temperature profiles 
00050 REAL, POINTER, DIMENSION(:,:) :: XSEAS  ! oceanic salinity profiles 
00051 REAL, POINTER, DIMENSION(:,:) :: XSEAU  ! oceanic zonal current profiles 
00052 REAL, POINTER, DIMENSION(:,:) :: XSEAV  ! oceanic meridian current profiles 
00053 REAL, POINTER, DIMENSION(:,:) :: XSEAE  ! oceanic kinetic turbulent energy profiles (^(1/2))
00054 REAL, POINTER, DIMENSION(:,:) :: XSEABATH !bathymetry indice
00055                                           !=1 for free sea water
00056                                           !=0 for sea-bed
00057 REAL, POINTER, DIMENSION(:) ::   XSEAHMO! oceanic mixing lengths
00058 !
00059 REAL, POINTER, DIMENSION(:,:) :: XLE,XLK! oceanic mixing lengths
00060 REAL, POINTER, DIMENSION(:,:) :: XKMEL,XKMELM  ! oceanic mixing coefficients
00061 !
00062 REAL, POINTER, DIMENSION(:) ::   XSEATEND! SST tendance
00063 !
00064 REAL, POINTER, DIMENSION(:,:) ::   XDTFSOL ! Temp tendancy due to solar flux
00065 REAL, POINTER, DIMENSION(:)   ::   XDTFNSOL! -------------------- non solar flux
00066 !
00067 END TYPE OCEAN_t
00068 !
00069 TYPE(OCEAN_t), ALLOCATABLE, TARGET, SAVE :: OCEAN_MODEL(:)
00070 !
00071 LOGICAL, POINTER :: LMERCATOR=>NULL()
00072 !$OMP THREADPRIVATE(LMERCATOR)
00073 LOGICAL, POINTER :: LCURRENT=>NULL()
00074 !$OMP THREADPRIVATE(LCURRENT)
00075 LOGICAL, POINTER :: LPROGSST=>NULL()
00076 !$OMP THREADPRIVATE(LPROGSST)
00077 INTEGER, POINTER :: NTIME_COUPLING=>NULL()
00078 !$OMP THREADPRIVATE(NTIME_COUPLING)
00079 INTEGER, POINTER :: NOCTCOUNT=>NULL()
00080 !$OMP THREADPRIVATE(NOCTCOUNT)
00081 REAL, POINTER, DIMENSION(:,:) :: XSEAT=>NULL()
00082 !$OMP THREADPRIVATE(XSEAT)
00083 REAL, POINTER, DIMENSION(:,:) :: XSEAS=>NULL()
00084 !$OMP THREADPRIVATE(XSEAS)
00085 REAL, POINTER, DIMENSION(:,:) :: XSEAU=>NULL()
00086 !$OMP THREADPRIVATE(XSEAU)
00087 REAL, POINTER, DIMENSION(:,:) :: XSEAV=>NULL()
00088 !$OMP THREADPRIVATE(XSEAV)
00089 REAL, POINTER, DIMENSION(:,:) :: XSEAE=>NULL()
00090 !$OMP THREADPRIVATE(XSEAE)
00091 REAL, POINTER, DIMENSION(:,:) :: XSEABATH=>NULL()
00092 !$OMP THREADPRIVATE(XSEABATH)
00093 REAL, POINTER, DIMENSION(:)   :: XSEAHMO=>NULL()
00094 !$OMP THREADPRIVATE(XSEAHMO)
00095 REAL, POINTER, DIMENSION(:,:) :: XLE=>NULL()
00096 !$OMP THREADPRIVATE(XLE)
00097 REAL, POINTER, DIMENSION(:,:) :: XLK=>NULL()
00098 !$OMP THREADPRIVATE(XLK)
00099 REAL, POINTER, DIMENSION(:,:) :: XKMEL=>NULL()
00100 !$OMP THREADPRIVATE(XKMEL)
00101 REAL, POINTER, DIMENSION(:,:) :: XKMELM=>NULL()
00102 !$OMP THREADPRIVATE(XKMELM)
00103 REAL, POINTER, DIMENSION(:)   :: XSEATEND=>NULL()
00104 !$OMP THREADPRIVATE(XSEATEND)
00105 REAL, POINTER, DIMENSION(:)   :: XDTFNSOL=>NULL()
00106 !$OMP THREADPRIVATE(XDTFNSOL)
00107 REAL, POINTER, DIMENSION(:,:) :: XDTFSOL=>NULL()
00108 !$OMP THREADPRIVATE(XDTFSOL)
00109 
00110 CONTAINS
00111 
00112 SUBROUTINE OCEAN_GOTO_MODEL(KFROM, KTO, LKFROM)
00113 LOGICAL, INTENT(IN) :: LKFROM
00114 INTEGER, INTENT(IN) :: KFROM, KTO
00115 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00116 !
00117 ! Save current state for allocated arrays
00118 IF (LKFROM) THEN
00119 OCEAN_MODEL(KFROM)%XSEAT=>XSEAT
00120 OCEAN_MODEL(KFROM)%XSEAS=>XSEAS
00121 OCEAN_MODEL(KFROM)%XSEAU=>XSEAU
00122 OCEAN_MODEL(KFROM)%XSEAV=>XSEAV
00123 OCEAN_MODEL(KFROM)%XSEAE=>XSEAE
00124 OCEAN_MODEL(KFROM)%XSEABATH=>XSEABATH
00125 OCEAN_MODEL(KFROM)%XSEAHMO=>XSEAHMO
00126 OCEAN_MODEL(KFROM)%XLE=>XLE
00127 OCEAN_MODEL(KFROM)%XLK=>XLK
00128 OCEAN_MODEL(KFROM)%XKMEL=>XKMEL
00129 OCEAN_MODEL(KFROM)%XKMELM=>XKMELM
00130 OCEAN_MODEL(KFROM)%XSEATEND=>XSEATEND
00131 OCEAN_MODEL(KFROM)%XDTFNSOL=>XDTFNSOL
00132 OCEAN_MODEL(KFROM)%XDTFSOL=>XDTFSOL
00133 ENDIF
00134 !
00135 ! Current model is set to model KTO
00136 IF (LHOOK) CALL DR_HOOK('MODD_OCEAN_N:OCEAN_GOTO_MODEL',0,ZHOOK_HANDLE)
00137 LMERCATOR=>OCEAN_MODEL(KTO)%LMERCATOR
00138 LCURRENT=>OCEAN_MODEL(KTO)%LCURRENT
00139 LPROGSST=>OCEAN_MODEL(KTO)%LPROGSST
00140 NTIME_COUPLING=>OCEAN_MODEL(KTO)%NTIME_COUPLING
00141 NOCTCOUNT=>OCEAN_MODEL(KTO)%NOCTCOUNT
00142 XSEAT=>OCEAN_MODEL(KTO)%XSEAT
00143 XSEAS=>OCEAN_MODEL(KTO)%XSEAS
00144 XSEAU=>OCEAN_MODEL(KTO)%XSEAU
00145 XSEAV=>OCEAN_MODEL(KTO)%XSEAV
00146 XSEAE=>OCEAN_MODEL(KTO)%XSEAE
00147 XSEABATH=>OCEAN_MODEL(KTO)%XSEABATH
00148 XSEAHMO=>OCEAN_MODEL(KTO)%XSEAHMO
00149 XLE=>OCEAN_MODEL(KTO)%XLE
00150 XLK=>OCEAN_MODEL(KTO)%XLK
00151 XKMEL=>OCEAN_MODEL(KTO)%XKMEL
00152 XKMELM=>OCEAN_MODEL(KTO)%XKMELM
00153 XSEATEND=>OCEAN_MODEL(KTO)%XSEATEND
00154 XDTFNSOL=>OCEAN_MODEL(KTO)%XDTFNSOL
00155 XDTFSOL=>OCEAN_MODEL(KTO)%XDTFSOL
00156 IF (LHOOK) CALL DR_HOOK('MODD_OCEAN_N:OCEAN_GOTO_MODEL',1,ZHOOK_HANDLE)
00157 
00158 END SUBROUTINE OCEAN_GOTO_MODEL
00159 
00160 SUBROUTINE OCEAN_ALLOC(KMODEL)
00161 INTEGER, INTENT(IN) :: KMODEL
00162 INTEGER :: J
00163 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00164 IF (LHOOK) CALL DR_HOOK("MODD_OCEAN_N:OCEAN_ALLOC",0,ZHOOK_HANDLE)
00165 ALLOCATE(OCEAN_MODEL(KMODEL))
00166 DO J=1,KMODEL
00167   NULLIFY(OCEAN_MODEL(J)%XSEAT)
00168   NULLIFY(OCEAN_MODEL(J)%XSEAS)
00169   NULLIFY(OCEAN_MODEL(J)%XSEAU)
00170   NULLIFY(OCEAN_MODEL(J)%XSEAV)
00171   NULLIFY(OCEAN_MODEL(J)%XSEAE)
00172   NULLIFY(OCEAN_MODEL(J)%XSEABATH)
00173   NULLIFY(OCEAN_MODEL(J)%XSEAHMO)
00174   NULLIFY(OCEAN_MODEL(J)%XLE)
00175   NULLIFY(OCEAN_MODEL(J)%XLK)
00176   NULLIFY(OCEAN_MODEL(J)%XKMEL)
00177   NULLIFY(OCEAN_MODEL(J)%XKMELM)
00178   NULLIFY(OCEAN_MODEL(J)%XSEATEND)
00179   NULLIFY(OCEAN_MODEL(J)%XDTFNSOL)
00180   NULLIFY(OCEAN_MODEL(J)%XDTFSOL)
00181 ENDDO
00182 OCEAN_MODEL(:)%LMERCATOR=.FALSE.
00183 OCEAN_MODEL(:)%LCURRENT=.FALSE.
00184 OCEAN_MODEL(:)%LPROGSST=.FALSE.
00185 OCEAN_MODEL(:)%NTIME_COUPLING=0
00186 OCEAN_MODEL(:)%NOCTCOUNT=0
00187 IF (LHOOK) CALL DR_HOOK("MODD_OCEAN_N:OCEAN_ALLOC",1,ZHOOK_HANDLE)
00188 END SUBROUTINE OCEAN_ALLOC
00189 
00190 SUBROUTINE OCEAN_DEALLO
00191 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00192 IF (LHOOK) CALL DR_HOOK("MODD_OCEAN_N:OCEAN_DEALLO",0,ZHOOK_HANDLE)
00193 IF (ALLOCATED(OCEAN_MODEL)) DEALLOCATE(OCEAN_MODEL)
00194 IF (LHOOK) CALL DR_HOOK("MODD_OCEAN_N:OCEAN_DEALLO",1,ZHOOK_HANDLE)
00195 END SUBROUTINE OCEAN_DEALLO
00196 
00197 END MODULE MODD_OCEAN_n