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