-
Antoine Cyril David Hoffmann authoredAntoine Cyril David Hoffmann authored
closure_mod.F90 2.60 KiB
module closure
! Contains the routines to define closures
IMPLICIT NONE
PUBLIC :: apply_closure_model
CONTAINS
! Positive Oob indices are approximated with a model
SUBROUTINE apply_closure_model
USE prec_const, ONLY: dp
USE model, ONLY: CLOS
USE grid, ONLY: local_nj,ngj, jarray,&
local_np,ngp, parray, dmax
USE fields, ONLY: moments
USE time_integration, ONLY: updatetlevel
IMPLICIT NONE
INTEGER ::ij,ip,ia
IF (CLOS .EQ. 0) THEN
! zero truncation, An+1=0 for n+1>nmax only
CALL ghosts_upper_truncation
ELSEIF (CLOS .EQ. 1) THEN
! truncation at highest fully represented kinetic moment
! e.g. Dmax = 3 means
! only Napj s.t. p+2j <= 3 are evolved
! -> (p,j) allowed are (0,0),(1,0),(0,1),(2,0),(1,1),(3,0)
! =>> Dmax = min(Pmax,2*Jmax+1)
j: DO ij = 1,local_nj+ngj
p: DO ip = 1,local_np+ngp
IF ( parray(ip)+2*jarray(ij) .GT. dmax) THEN
moments(ia,ip,ij,:,:,:,updatetlevel) = 0._dp
ENDIF
ENDDO p
ENDDO j
ELSE
ERROR STOP '>> ERROR << Closure scheme not found '
ENDIF
CALL ghosts_lower_truncation
END SUBROUTINE apply_closure_model
! Positive Oob indices are approximated with a model
SUBROUTINE ghosts_upper_truncation
USE prec_const, ONLY: dp
USE grid, ONLY: local_np,ngp,local_pmax, pmax,&
local_nj,ngj,local_jmax, jmax
USE fields, ONLY: moments
USE time_integration, ONLY: updatetlevel
IMPLICIT NONE
INTEGER ::ig
! zero truncation, An+1=0 for n+1>nmax
! applies only for the processes that evolve the highest moment degree
IF(local_jmax .GE. Jmax) THEN
DO ig = 1,ngj/2
moments(:,:,local_nj+ngj/2+ig,:,:,:,updatetlevel) = 0._dp
ENDDO
ENDIF
! applies only for the process that has largest p index
IF(local_pmax .GE. Pmax) THEN
DO ig = 1,ngp/2
moments(:,local_np+ngp/2+ig,:,:,:,:,updatetlevel) = 0._dp
ENDDO
ENDIF
END SUBROUTINE ghosts_upper_truncation
! Negative OoB indices are 0
SUBROUTINE ghosts_lower_truncation
USE prec_const, ONLY: dp
USE grid, ONLY: ngp,ngj,local_pmin,local_jmin
USE fields, ONLY: moments
USE time_integration, ONLY: updatetlevel
IMPLICIT NONE
INTEGER :: ig
! zero truncation, An=0 for n<0
IF(local_jmin .EQ. 0) THEN
DO ig = 1,ngj/2
moments(:,:,ig,:,:,:,updatetlevel) = 0._dp
ENDDO
ENDIF
! applies only for the process that has lowest p index
IF(local_pmin .EQ. 0) THEN
DO ig = 1,ngp/2
moments(:,ig,:,:,:,:,updatetlevel) = 0._dp
ENDDO
ENDIF
END SUBROUTINE ghosts_lower_truncation
END module closure