From 3d6853a0ffd81389b9d07cfe8afb948809c55560 Mon Sep 17 00:00:00 2001
From: Antoine Cyril David Hoffmann <ahoffman@spcpc606.epfl.ch>
Date: Tue, 27 Oct 2020 10:49:35 +0100
Subject: [PATCH] Project of adaptative time step scheme

---
 src/advance_field_adapt.F90 | 80 +++++++++++++++++++++++++++++++++++++
 1 file changed, 80 insertions(+)
 create mode 100644 src/advance_field_adapt.F90

diff --git a/src/advance_field_adapt.F90 b/src/advance_field_adapt.F90
new file mode 100644
index 00000000..d2d18f26
--- /dev/null
+++ b/src/advance_field_adapt.F90
@@ -0,0 +1,80 @@
+MODULE advance_field_routine
+
+USE prec_const
+implicit none
+
+CONTAINS
+
+  SUBROUTINE advance_time_level
+
+    USE basic
+    USE time_integration
+    use prec_const
+    IMPLICIT NONE
+
+    call set_updatetlevel(mod(updatetlevel,ntimelevel)+1)
+
+  END SUBROUTINE advance_time_level
+
+
+
+  SUBROUTINE advance_field( f, f_rhs )
+
+    USE basic
+    USE time_integration
+    USE array
+    USE grid
+    use prec_const
+    IMPLICIT NONE
+
+    COMPLEX(dp), DIMENSION ( ikrs:ikre, ikzs:ikze, ntimelevel ) :: f
+    COMPLEX(dp), DIMENSION ( ikrs:ikre, ikzs:ikze, ntimelevel ) :: f_rhs
+    REAL(dp)    :: error
+    INTEGER     :: istage
+
+    SELECT CASE (updatetlevel)
+
+    CASE(1)
+      SELECT CASE (numerical_scheme)
+
+      CASE ('DOPRI5_ADAPT')
+        error = 0._dp
+        DO ikz=ikzs,ikze
+          DO ikr=ikrs,ikre
+            fs = f(ikr,ikz,1)
+            DO istage=1,ntimelevel
+              f(ikr,ikz,1) = f(ikr,ikz,1) + dt*b_E(istage)*f_rhs(ikr,ikz,istage)
+              fs = fs + dt*b_Es(istage)*f_rhs(ikr,ikz,istage)
+            END DO
+            IF ( ABS(f(ikr,ikz,1) - fs) .GT. error ) THEN
+              error = ABS(f(ikr,ikz,1) - fs)
+            ENDIF
+          END DO
+        END DO
+        IF (error > TOL)
+      CASE DEFAULT
+        DO ikz=ikzs,ikze
+          DO ikr=ikrs,ikre
+            fs = f(ikr,ikz,1)
+            DO istage=1,ntimelevel
+            f(ikr,ikz,1) = f(ikr,ikz,1) + dt*b_E(istage)*f_rhs(ikr,ikz,istage)
+            END DO
+          END DO
+        END DO
+      END SELECT
+
+    CASE DEFAULT
+      DO ikz=ikzs,ikze
+        DO ikr=ikrs,ikre
+          f(ikr,ikz,updatetlevel) = f(ikr,ikz,1);
+          DO istage=1,updatetlevel-1
+            f(ikr,ikz,updatetlevel) = f(ikr,ikz,updatetlevel) + &
+                                  dt*A_E(updatetlevel,istage)*f_rhs(ikr,ikz,istage)
+          END DO
+        END DO
+      END DO
+    END SELECT
+
+  END SUBROUTINE advance_field
+
+END MODULE advance_field_routine
-- 
GitLab