Выделенный вариант таблицы - PullRequest
0 голосов
/ 16 февраля 2020
 PROGRAM satellite
  IMPLICIT NONE
  INTEGER                                  :: i, j, ok, nc
  REAL                                     :: alph, bet, chi, ninf1, C1
  REAL, DIMENSION(:), ALLOCATABLE          :: uexact, x, Econs
  REAL                                     :: E, k, Lc, hc, eps, h

  Read*,nc
  E=25. ; k=125. ; hc=0.01 ; eps=0.01 ; Lc=1 ;

  h = Lc/nc ; chi=sqrt((E*hc)/k) ; alph= -(1/h**2) ; bet=(2/h**2)+(k/(E*hc))

  ALLOCATE(x(0:nc), uexact(0:nc), Econs(0:nc))

  OPEN(UNIT=888,FILE="uetuexact.out",ACTION="write",STATUS='old')
  OPEN(UNIT=889,FILE="consistance.out",ACTION="write",STATUS='old')


  DO i = 0, nc
   x(i) = h*i-Lc/2
   uexact(i) = eps*chi*((sinh(x(i)/chi))/(cosh(Lc/(2*chi))))
 END DO
 !-------------------------------------------------------------------------------
 DO i=1,nc-1
   Econs(i)=(alph*(uexact(i-1)))+(bet*(uexact(i)))+(alph*(uexact(i+1)))
 END DO

 ninf1=maxval(Econs)
 C1=ninf1*(nc**2)

DO i = 0, nc
  WRITE(888,fmt='(3E15.6)') x(i), uexact(i)
  WRITE(889,fmt='(3E15.6)') x(i), uexact(i), -Econs(i)
END DO

Print* , 'nc :', nc
Print* , 'h :', h
Print* , 'ninf1 :', ninf1
Print* , 'C1 :', C1

END PROGRAM satellite

Мне нужно, чтобы моя переменная n c изменилась с 10, 50, 100, 500, 1000, 5000, 10000, чтобы записать для каждого заданного значения n c, значения ninf1 и C1. Пока я делал n c вручную, но мне нужен файл .out: который дает мне n c | ninf1 | С1. Я хочу знать, как я могу точно изменить мои n c на эти значения.

1 Ответ

1 голос
/ 16 февраля 2020

Вы можете сделать следующее:

  • определить массив nsizes, который будет содержать все значения, которые вы хотите nc принять.
  • объявить переменную iter который будет проходить по этому массиву
  • итерация с iter по длине nsizes
  • В начале каждой итерации присваивается nc = nsizes(iter)
  • В конце каждая итерация освобождает массивы

Вот патч, который делает именно это.

--- satellite.f90   2020-02-16 18:13:35.662123215 +0700
+++ satellite_loop.f90  2020-02-16 18:50:09.662029872 +0700
@@ -1,11 +1,15 @@
 PROGRAM satellite
   IMPLICIT NONE
-  INTEGER                                  :: i, j, ok, nc
+  INTEGER                                  :: i, j, ok, nc, iter
   REAL                                     :: alph, bet, chi, ninf1, C1
   REAL, DIMENSION(:), ALLOCATABLE          :: uexact, x, Econs
   REAL                                     :: E, k, Lc, hc, eps, h
+  INTEGER, DIMENSION(7)                    :: nsizes = (/ 10, 50, 100, 500, 1000, 5000, 10000/)
+
+ !  Read*,nc
+ do  iter = 1, 7
+  nc = nsizes(iter)

-  Read*,nc
   E=25. ; k=125. ; hc=0.01 ; eps=0.01 ; Lc=1 ;

   h = Lc/nc ; chi=sqrt((E*hc)/k) ; alph= -(1/h**2) ; bet=(2/h**2)+(k/(E*hc))
@@ -38,4 +42,8 @@
 Print* , 'ninf1 :', ninf1
 Print* , 'C1 :', C1

+deallocate(x, uexact, econs)
+
+end do
+
 END PROGRAM satellite

Вывод будет выглядеть так:

 nc :          10
 h :  0.100000001    
 ninf1 :   1.17741162E-02
 C1 :   1.17741168    
 nc :          50
 h :   1.99999996E-02
 ninf1 :   2.39971280E-03
 C1 :   5.99928188    
 nc :         100
 h :   9.99999978E-03
 ninf1 :   7.46726990E-04
 C1 :   7.46726990    
 nc :         500
 h :   2.00000009E-03
 ninf1 :   1.44958496E-04
 C1 :   36.2396240    
 nc :        1000
 h :   1.00000005E-03
 ninf1 :   8.23974609E-04
 C1 :   823.974609    
 nc :        5000
 h :   1.99999995E-04
 ninf1 :   2.73437500E-02
 C1 :   683593.750    
 nc :       10000
 h :   9.99999975E-05
 ninf1 :  0.125000000    
 C1 :   12500000.0    
...