2017-05-28 1 views
0

Je crée un code fortran pour calculer la température d'un modèle cfd. Ce code sera appelé à chaque itération d'une simulation en régime permanent et calculera la température. À chaque appel de mon code/itération, je veux que mon code fortran enregistre également le champ de température sur un fichier txt et enregistre. Après avoir calculé le champ de température et de sauvegarder les valeurs dans tField (100; 1: 6) la partie avec l'enregistrement dans le fichier txt ressemble:Ecrire dans une nouvelle ligne sur chaque écriture (33, *) comand dans Fortran77

OPEN(UNIT=35,FILE='W:\temperaturField.txt', 
&FORM ='FORMATTED',STATUS='UNKNOWN', 
&ACTION='READWRITE') 

WRITE (35,FMT='5(F8.3,2X))') TFIELD(100,1:6) 

Avec ce code, il remplace seulement la première ligne de mon fichier txt sur tous les itération. Mais je veux coller chaque tableau TFIELD (100,1: 6) sur une nouvelle ligne. Comment puis-je faire ceci?

+0

il ne remplacerait que si vous avez fermé et rouvert le fichier ou un tel. Afficher tout le code pertinent si vous voulez plus d'aide. – agentp

+0

Lorsque je vous ai recommandé d'ouvrir une nouvelle question, je vous ai également demandé de fournir les détails. S'il vous plaît faites-le, c'est vraiment important. –

+1

* "à chaque itération" * ??? Il n'y a pas d'itérations dans le code que vous avez montré. Voir [demander] et [mcve], nous avons besoin de voir plus, nous ne pouvons pas voir votre code dans notre boule de cristal. –

Répondre

1

Ajouter postition = 'APPEND' à OPEN:

OPEN(UNIT=35,FILE='W:\temperaturField.txt', 
&FORM ='FORMATTED',STATUS='UNKNOWN',POSITION='APPEND', 
&ACTION='READWRITE') 
+0

Peut-être, mais s'il fait vraiment dans chaque itération d'une boucle il devrait penser à garder le fichier ouvert. –

+0

C'était vrai! Je vous remercie! –

0

Il semble que vous ouvrez et fermez le fichier pour chaque itération. C'est une méthode rapide et sale si vous avez besoin de déboguer, mais c'est lent.

Si vous voulez faire cela, vous pouvez faire ce que @Jack dit: Inclure un POSITION='APPEND' à l'instruction OPEN pour définir la position pour écrire les données à la fin du fichier. En outre, vous devez vous assurer que vous le fermez à chaque fois.

Une meilleure méthode (plus efficace) consisterait à garder le fichier ouvert pendant tout le temps. Je le ferais avec un module:

module temp_writer_module 
    implicit none 
    integer :: temp_writer_unit 
    logical :: is_opened = .FALSE. 
    private :: temp_writer_unit, is_opened 

contains 

    subroutine temp_writer_open() 
     integer :: ios 
     character(len=100) :: iomsg 
     if (is_opened) then 
      print*, "Warning: Temperature file already openend" 
      return 
     end if 
     open(newunit=temp_writer_unit, file='W:\temperatureField', & 
      form='FORMATTED', status='UNKNOWN', action='WRITE', & 
      iostat=ios, iomsg=iomsg) 
     if (ios /= 0) then 
      print*, "Error opening temperature file:" 
      print*, trim(iomsg) 
      STOP 
     end if 
     is_opened = .TRUE. 
    end subroutine temp_writer_open 

    subroutine temp_writer_close() 
     if (.not. is_opened) return 
     close(temp_writer_unit) 
     is_opened = .FALSE. 
    end subroutine temp_writer_close 

    subroutine temp_writer(temps) 
     real, intent(in) :: temps(6) 
     integer :: ios 
     character(len=100) :: iomsg 
     if (.not. is_opened) call temp_writer_open() 
     write(temp_writer_unit, *, iostat=ios, iomsg=iomsg) temps 
     if (ios /= 0) then 
      print*, "Error writing to temperature file:" 
      print*, trim(iomsg) 
     end if 
    end subroutine temp_writer 

end module temp_writer_module 

Ensuite, vous pouvez l'utiliser dans votre programme comme celui-ci:

subroutine calc_temps(...) 
    use temp_writer_module 
    <variable declarations> 
    <calculations> 
    call temp_writer(tfield(100, 1:6)) 
end subroutine calc_temps 

Il suffit de ne pas oublier d'appeler la routine temp_writer_close avant la fin de votre programme.