2016-07-26 14 views
-3

Ich bin für eine Weile auf diesem festgefahren. Ich habe eine Simulation in Fortran90 durchgeführt.Fassen Sie die Ausgabe zusammen

program epidemic 
implicit none 

!!!variable declaration 
integer, parameter::n=625 
real, dimension(1:n)::x,y 
real :: alpha, beta, epsilon, dist, prob, u 
    integer, dimension(1:n) :: infections 
integer:: T, I1, I2, I3, i, j, K2, infperiod, k, tmax 


!!!!!!!!!! paramater value 
tmax=11 
alpha=0.4 
gamma=9 

!!Generate population!! 
I3=1 
Do I1=1, 25, 1 
    Do I2=1,25,1 
     x(I3)=REAL(I1) 
     y(I3)=REAL(I2) 
     Infections(I3)=0 
     I3=I3+1 

    ENDDO 
ENDDO 



!!!INITIAL INFECTION!!! 

call random_number(u) 
k2=1+aint(u)*n 
infections(k2)=1 








!!!! initial infection !!!!!! 
    call random_number(u) 
      IF (prob >= u) THEN 

     END IF 
    END IF 



    ENDDO 
    enddo 



!!! output data 

!!! writing and saving 

Do i= 1, n 

    write(*,*) i, x(i), y(i) 
ENDDO 



end program epidemic 

Das Ergebnis meiner Simulation ist ein Datenrahmen, der wie folgt solche Individuen darstellt

 1 1.00000000  1.00000000    1 
     2 1.00000000  2.00000000    4 
     3 1.00000000  3.00000000    3 
     4 1.00000000  4.00000000    4 
     5 1.00000000  5.00000000    4 
     6 1.00000000  6.00000000    4 
     7 1.00000000  7.00000000    4 
     8 1.00000000  8.00000000    2 
     9 1.00000000  9.00000000    4 
     10 1.00000000  10.0000000    4 
     11 1.00000000  11.0000000    5 
     12 1.00000000  12.0000000    5 
     13 1.00000000  13.0000000    4 
     14 1.00000000  14.0000000    5 
     15 1.00000000  15.0000000    6 

Die erste Spalte sieht, daß i 1 = 625, wobei die zweite und die dritte Spalte die Matrixindizes darstellt [ich, j]. Die vierte Spalte stellt die (Zeit) (1:15 Tage) dar, die die Person die Infektionen bekommen. Ich möchte die Ausgabe in nur zwei Spalten ablegen können.

Zur Veranschaulichung möchte ich eine neue Variable erstellen, die zeigt, dass viele Menschen an diesem Tag infiziert wurden.

also die Ausgabe der 625 Zeilen wird so etwas wie dieses

      AT Day=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
    Total of infected individual =3 5 6 7 11 8 0 1 ........... 

Danke sehr, sehr viel

+0

Verwerfen Sie keine Fragen, indem Sie wichtigen Code löschen, auf dem die Antworten basieren. –

Antwort

0

Jetzt, wo es ist Löschen Sie, was Sie haben, versuchen Sie dies:

Fügen Sie eine neue Deklaration

hinzu
integer, dimension(15) :: infection_day 

und nach Ihrer bestehenden Schleife do T ..., legen Sie so etwas wie

do i = 1, 15 
    infection_day(i) = count(infections==i) 
end do 

Ihre Daten zusammenzufassen.

Ich habe kein Fortran auf dieser Maschine, also habe ich dieses Codefragment nicht getestet, aber es sollte dich auf den richtigen Weg bringen.

+0

Vielen Dank @High Performance Mark. Ihre Methode hat getan, womit ich mich gestritten habe. Nochmals, ich danke Ihnen sehr, dass Sie mir geantwortet haben. – sxq2221

0

Dies sollte Ihnen den Einstieg ...

... 
INTEGER, DIMENSION(31) :: Sums 
!day is the 4th column from 1:625... 
... 
Sums(:) = 0 
... 
DO Entry = 1, 625 
    Sums(Thedayindex) = Sums(Thedayindex) + Day(Entry) 
ENDDO 
... 
+1

Wahrscheinlich ein Tippfehler, meinst du 'Sums (Entry)'? –

+0

Korrekt ... Wenn das OP die Anzahl der Ereignisse am Tag des Monats möchte, dann müssen sie jeden Ereignistag des Monats, in dem das Ereignis auftritt, in 31-Tage-Intervalle summieren ... Also hatte ich wieder einen Tippfehler; Am einfachsten zu verstehen ist eine Menge von wenn, sonst, wenn in den Tag Summen hinzugefügt werden, aber es ist schneller und einfacher, um die Logik richtig durch Summierung direkt in die richtige bin (IMO). – Holmz

+0

In diesem Fall gibt es mindestens eine mehr Tippfehler: "Sum" gegen "Sums" –