From 977cd88ed3b83b47966fe75d467e5d3fddc9eadd Mon Sep 17 00:00:00 2001 From: Antoine Cyril David Hoffmann <ahoffman@spcpc606.epfl.ch> Date: Fri, 15 Jan 2021 14:32:36 +0100 Subject: [PATCH] module for different closure model --- src/closure_mod.F90 | 73 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/closure_mod.F90 diff --git a/src/closure_mod.F90 b/src/closure_mod.F90 new file mode 100644 index 00000000..f5dcc433 --- /dev/null +++ b/src/closure_mod.F90 @@ -0,0 +1,73 @@ +module closure +! Contains the routines to define closures +USE basic +USE model, ONLY: CLOS +USE grid +USE array, ONLY: kernel_e, kernel_i +USE fields, ONLY: moments_e, moments_i + +IMPLICIT NONE + +PUBLIC :: apply_closure_model + +CONTAINS + + SUBROUTINE apply_closure_model + IMPLICIT NONE + + + ! Negative out of bounds indices are put to zero (analytically correct) + moments_e(ips_e-1,:,:,:,:) = 0._dp + moments_e(ips_e-2,:,:,:,:) = 0._dp + moments_e(:,ijs_e-1,:,:,:) = 0._dp + kernel_e(ijs_e-1,:,:) = 0._dp + + moments_i(ips_i-1,:,:,:,:) = 0._dp + moments_i(ips_i-2,:,:,:,:) = 0._dp + moments_i(:,ijs_i-1,:,:,:) = 0._dp + kernel_i(ijs_i-1,:,:) = 0._dp + + ! Positive Oob indices are approximated with a model + IF (CLOS .EQ. 0) THEN + ! zero truncation, An+1=0 for n+1>nmax + moments_e(ipe_e+1,:,:,:,:) = 0._dp + moments_e(ipe_e+2,:,:,:,:) = 0._dp + moments_e(:,ije_e+1,:,:,:) = 0._dp + kernel_e(ije_e+1,:,:) = 0._dp + + moments_i(ipe_i+1,:,:,:,:) = 0._dp + moments_i(ipe_i+2,:,:,:,:) = 0._dp + moments_i(:,ije_i+1,:,:,:) = 0._dp + kernel_i(ije_i+1,:,:) = 0._dp + + + ELSEIF (CLOS .EQ. 1) THEN + ! Copy truncation with n+1 = min(nmax,n+1) + ! here pmax+1 and pmax_2 are mapped to pmax + moments_e(ipe_e+1,:,:,:,:) = moments_e(ipe_e,:,:,:,:) + moments_e(ipe_e+2,:,:,:,:) = moments_e(ipe_e,:,:,:,:) + moments_e(:,ije_e+1,:,:,:) = moments_e(:,ije_e,:,:,:) + kernel_e(ije_e+1,:,:) = kernel_e(ije_e,:,:) + + moments_i(ipe_i+1,:,:,:,:) = moments_i(ipe_i,:,:,:,:) + moments_i(ipe_i+2,:,:,:,:) = moments_i(ipe_i,:,:,:,:) + moments_i(:,ije_i+1,:,:,:) = moments_i(:,ije_i,:,:,:) + kernel_i(ije_i+1,:,:) = kernel_i(ije_i,:,:) + + + ELSEIF (CLOS .EQ. 2) THEN + ! Copy truncation with special treatment for Hermite + ! here pmax+1 is mapped to pmax-1 and pmax+2 to pmax + moments_e(ipe_e+1,:,:,:,:) = moments_e(ipe_e-1,:,:,:,:) + moments_e(ipe_e+2,:,:,:,:) = moments_e(ipe_e,:,:,:,:) + moments_e(:,ije_e+1,:,:,:) = moments_e(:,ije_e,:,:,:) + kernel_e(ije_e+1,:,:) = kernel_e(ije_e,:,:) + + moments_i(ipe_i+1,:,:,:,:) = moments_i(ipe_i-1,:,:,:,:) + moments_i(ipe_i+2,:,:,:,:) = moments_i(ipe_i,:,:,:,:) + moments_i(:,ije_i+1,:,:,:) = moments_i(:,ije_i,:,:,:) + kernel_i(ije_i+1,:,:) = kernel_i(ije_i,:,:) + ENDIF + + END SUBROUTINE apply_closure_model +END module closure -- GitLab