bastian1985 Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bastian1985 Geschrieben 28. April 2009 Autor Teilen Geschrieben 28. April 2009 mmh hat keiner eine Ahnung oder ein Tipp? habe es ja schon mit dem Aufruf "reshape" oder "spread" versucht, nur da erstellt man ja auch ein neues Array, will ja das das Array genau den selben Namen hat, nur um eine Dimension erweitert wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
casio Geschrieben 28. April 2009 Teilen Geschrieben 28. April 2009 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bastian1985 Geschrieben 29. April 2009 Autor Teilen Geschrieben 29. April 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
casio Geschrieben 29. April 2009 Teilen Geschrieben 29. April 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
casio Geschrieben 29. April 2009 Teilen Geschrieben 29. April 2009 (bearbeitet) Noch eine Vermutung 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 29. April 2009 von casio Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
casio Geschrieben 29. April 2009 Teilen Geschrieben 29. April 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bastian1985 Geschrieben 30. April 2009 Autor Teilen Geschrieben 30. April 2009 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.