Re: Reading in an ASCII file written by a FORTRAN program
- To: mathgroup at smc.vnet.net
- Subject: [mg97581] Re: Reading in an ASCII file written by a FORTRAN program
- From: David Bailey <dave at removedbailey.co.uk>
- Date: Mon, 16 Mar 2009 04:23:26 -0500 (EST)
- References: <gphdlo$ogj$1@smc.vnet.net>
hayes.tyler at gmail.com wrote: > Hello All: > > I didn't want to hijack another's thread about reading in fixed format > files into Mathematica and I was wondering if there is a way to read > FORTRAN written data. > > For my thesis used FORTRAN code for my number > crunching, and used function calls to DISLIN to visualize that data. > Now I have Mathematica, whose graphics capabilities are well beyond > anything I could previously do, I would like to recreate and improve > those graphs. The way I created the files of data (which I always used > a .d extension, but it doesn't matter what that would be called) is > demonstrated below. Please note, this is NOT binary data, but text > output with no FORMAT. For example: > > My FORTRAN code writes out: > > open(unit=30,name=fnout,status='old') > > write(30,'(a20)') fnmod > write(30,'(a20)') fnstr > write(30,*) nfault,hpl,vplx,vply,taua,tauf,amuu, > & tminn,tstepp,itime,TBIS,bulkms,ntm,ncycle,pdcy > write(30,*) ptrad > write(30,'(a1)') respfb > write(30,*) (timi(n), n=1,nfault) > write(30,*) (taub(n), n=1,nfault) > write(30,*) (delts(n), n=1,nf) > write(30,*) (cfr(n), n=1,nfault) > write(30,*) (dfr(n), n=1,nfault) > write(30,*) (slpdf(n), n=1,nf2) > write(30,*) (slpv(n), n=1,nfault) > write(30,*) (rhofcc(n), n=1,nfault) > write(30,*) (islip(n), n=1,nfault) > > (NOTE: not all variables are the same length, some are strings, some > doubles, etc.) > > I subsequently read back the data into FORTRAN as: > > open(unit=30,name=fnin,status='old') > > read(30,'(a20)') fnmod > read(30,'(a20)') fnstr > read(30,*) nfault,hpl,vplx,vply,taua,tauf,amuu, > & tminn,tstepp,ntime,TBIS,bulkms,ntm,ncycle,pdcy > read(30,*) ptrad > read(30,'(a1)') respfb > read(30,*) (timi(n), n=1,nfault) > read(30,*) (taub(n), n=1,nfault) > read(30,*) (delts(n), n=1,nf) > read(30,*) (cfr(n), n=1,nfault) > read(30,*) (dfr(n), n=1,nfault) > read(30,*) (slpdf(n), n=1,nf2) > read(30,*) (slpv(n), n=1,nfault) > read(30,*) (rhofcc(n), n=1,nfault) > read(30,*) (islip(n), n=1,nfault) > > So, the big question then is: How would I go about reading in the > above unformatted Fortran file within Mathematica? > > Thanks for any advice you may have. > > Cheers, > > t. > Yes, any text data can be read into Mathematica. As a last resort, one can always read such a file as a List of strings and manipulate the strings to extract the data you require. However, this is always a last resort, and not necessary here. First open the file: str=OpenRead["c:\\myfile"]; Now read the two character variables: fnmod=Read[str,Record]; tnstr=Read[str,Record]; (You may need to remove trailing spaces in these variables using StringTrim). Note that if you print out FullForm[fnmod] you will see exactly what characters are in the string. It may be easiest to read the rest one number at a time: x=Read[str,Number]; Note that all numbers will end up as Double Precision inside Mathematica. Since you didn't include any declarations in your code, it is not possible to determine if any of those arrays are CHARACTER variables, but hopefully you have the general idea by now. Remember that you can always read tricky bits as strings, and then pull the strings apart in Mathematica. The ToExpression function may be useful to convert a string into a number (say). Don't for get to close the stream when you are done: Close[str]; David Bailey http://www.dbaileyconsultancy.co.uk