Zum Inhalt springen

[FORTRAN90] Arrays um eine Dimension erweitern


bastian1985

Empfohlene Beiträge

Guten Tag,

sitzte gerade an meiner Diplomarbeit, in welcher ich ein Programm in Fortran umschreiben muss. Es soll später soll 2D als auch 3D Berechnungen durchführen können.

Mein Problem die Variable ist die Zellnummerierung, da sie ja einmal 2d und einmal 3d sein muss

das steht in meiner Varialbendeklaration

integer,pointer,dimension(:,: ) CellNum

jetzt möchte ist das wenn

if (dim3d=.True.) !es wird als 3dimensional gerechnet

dass dann die Variable Cellnum folgende form hat

integer,pointer,dimension(:,:,: ) CellNum

hätte vielleicht einer eine Ahnung wie das geht.

Vielen Dank für die Hilfe!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ihc muss mal nachfragen, was du unter deinen Dimensionen verstehst:

2dim : dim[][] oder dim[2] ?

3dim : dim[][][] oder dim[3] ?

Zu dim[][], dim[][][]

Ich weiß gar nicht, ob das in Fortran überhaupt möglich ist, dass du mit einer Variable unterschiedliche Typen verwalten kannst und ich programmiert schon länger mit Fortran, aber mehr 77 als 90.

Mal angenommen, du würdest es hinbekommen, dann hat trotzdem ein 2dim array eine andere syntax als ein 3dim array und da hättest du weitere probleme es im quellcode zu verallgemeinern.

Wieso deklarierst du nicht immer ein 3dim array und nimmst die 3. dim nur in anspruch, wenn du mit 3d rechnen möchtest oder unterschiedliche Funktionen/Routinen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

hi danke für die Antwort

du hast das richtig verstanden, mit 3 dim meine ich dim(3).

Das mit dem nur als 3D Array zu deklarieren darüber denke ich gerade auch nach. Dies würde aber auch einiges erschweren, da das Programm Daten aus einer Datei einließt, die im 2D Fall halt eine andere Form hat, als im 3D Fall.

Aber wenn es sowieso keinen Befehl dafür gibt ist es ja meine einzige Lösung

Vielen Dank für deine Hilfe

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielleicht hilft dir das ein wenig weiter:

program test

integer*4 dim

real*4 d2(2), d3(3)

dim=3

call sub1(dim)

call sub2(d2)

call sub2(d3)

end

subroutine sub1(dim)

integer*4 dim

real*4 p(3) --> p(dim) geht nicht, da er an dieser Stelle eine Konstante erwartet!!

end

subroutine sub2(dim) --> Der übergabeparameter kann hier 2d oder 3d sein, dann wird dim(2) oder dim(3), je nachdem, was du übergibst und so könntest du mit der selben variable 2d oder 3d Sachen berechnen

real*4 dim(*)

end

Link zu diesem Kommentar
Auf anderen Seiten teilen

Noch eine Vermutung :P

Ich vermute mal, dass diese Deklaration in einer Routine oder Funktion ist, denn

für diese Deklaration werden keine genauen Größen angegeben und das geht nur in Routinen/Funktionen, siehe sub2.

Ich kenne mich zu wenig mit F90 aus, aber folgendes macht mich stutzig:

integer,pointer,dimension(:,: ) soll ein 2dim array sein und nicht ein array von der länge 2, CellNum --> z.B. CellNum(10,10) und nicht CellNum(2) , Fortran77 CellNum(*,*)

integer,pointer,dimension(:,:,: ) CellNum z.B. CellNum(10,10,10) und nicht CellNum(3), Fortran77 CellNum(*,*,*)

Falls ich richtig liegen sollten, wieso arbeitest du nicht nach diesem Schema?

integer,pointer,dimension(:,: ) CellNum2d

integer,pointer,dimension(:,:,: ) CellNum3d

if(2d) then

berechnung mit CellNum2d

else

berechnung mit CellNum3d

endif

ich seh da keinen weg, wie man es verallgemeinern könnte...

Bearbeitet von casio
Link zu diesem Kommentar
Auf anderen Seiten teilen

Noch ein anderer Ansatz.. ^^

program test2

C

integer*4 d2x, d2y, d3x, d3y

C

real*4 d2(100,100), d3(100,100,100)

C

logical*2 log3d

C

C Voreinstellung + Punke einlesen...

C

log3d=.false.

d2x=5

d2y=5

d3x=5

d3y=5

C

C Verarbeiten...

call sub(log3d,d2,d2x,d2y,d3,d3x,d3y)

C

end

C

C

subroutine sub(log3d,d2,d2x,d2y,d3,d3x,d3y)

C

integer*4 d2x, d2y, d3x, d3y

C

real*4 d2(100,100), d3(100,100,100) !+ Voreinstellung

C

logical*2 log3d

C

if(log3d) then

continue

else

continue

endif

C

end

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey Danke Casioi für die vielen Ideen

wie dein Tipp schon sagt, ist das wohl der einzige weg:

***

if(2d) then

berechnung mit CellNum2d

else

berechnung mit CellNum3d

endif

***

so habe ich das im Programm jetzt auch ausgeführt, das wollte ich halt umgehen

dass ich dafür zwei Variablen benutzen muss, da im Programm dann sehr oft die Unterscheidung kommt, ob jetzt CellNum2d oder CellNum3d benutzt wird

wie hier:

if (dim3log) then

NumZ=1

endif

do i=1,NumX

do j=1,NumY

do k=1,NumZ !für 3D

if (dim3log) then

ic=CellNum3d(i,j,k) !für 3D

else

ic=CellNum2d(i,j)

endif

enddo

enddo

enddo

und ich hatte halt Angst, dass dadurch dadurch die Rechnendauer ansteigt, da er immer wieder die if-Abfrage behandeln muss.

Aber wie gesagt ist das der einzige Weg.

Vielen Dank nochmal!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...