@@ -245,10 +245,10 @@ LOGICAL FUNCTION PrjReadWriteImpl(ThePrjFile, ReadOrWrite, ForceOldVersion)
245245 COMMON / BATEXE/ in_batch
246246
247247 INTEGER , EXTERNAL :: GetCrystalSystem
248- INTEGER I, j, RW
249- CHARACTER * ( 255 ) tString
250- CHARACTER * (10 ) Version ! We have patch releases like "DASH 2.1.1"
251- REAL VerFig, PatchLevel
248+ INTEGER I, j, RW, MAJOR_IDX, MINOR_IDX, PATCH_IDX, END_IDX
249+ INTEGER MajorVersion,MinorVersion,PatchVersion
250+ CHARACTER * (255 ) tString, csol
251+ REAL PatchLevel
252252 REAL , PARAMETER :: TOLER = 1E-6
253253
254254 INTEGER BFIOErrorCode
@@ -268,21 +268,44 @@ LOGICAL FUNCTION PrjReadWriteImpl(ThePrjFile, ReadOrWrite, ForceOldVersion)
268268 OPEN (UNIT= hPrjFile,FILE= ThePrjFile,ACCESS= ' DIRECT' ,RECL= cRECLMult,FORM= ' UNFORMATTED' ,ERR= 999 )
269269 iPrjRecNr = 1
270270! Read / Write the header
271- tString = ProgramVersion// ' project file'
271+ tString = TRIM ( ProgramVersion) // ' project file'
272272 CALL FileRWString(hPrjFile, iPrjRecNr, RW, tString)
273+
274+ MAJOR_IDX = 6
275+ END_IDX = LEN (TRIM (tString))
276+ PATCH_IDX = LEN (TRIM (tString))
277+ DO I = MAJOR_IDX,LEN (TRIM (tString))
278+ IF ( tString(I:I) .EQ. ' .' ) THEN
279+ MINOR_IDX = I
280+ EXIT
281+ ENDIF
282+ ENDDO
283+
284+ DO I = MINOR_IDX+1 ,LEN (TRIM (tString))
285+ IF ( tString(I:I) .EQ. ' .' ) THEN
286+ PATCH_IDX = I
287+ EXIT
288+ ENDIF
289+ ENDDO
290+
291+ DO I = PATCH_IDX+1 ,LEN (TRIM (tString))
292+ IF ( tString(I:I) .EQ. ' ' ) THEN
293+ END_IDX = I
294+ EXIT
295+ ENDIF
296+ ENDDO
297+
298+ READ (tString(MAJOR_IDX:MINOR_IDX-1 ),' (I)' , ERR= 999 ) MajorVersion
299+ READ (tString(MINOR_IDX+1 :PATCH_IDX-1 ),' (I)' , ERR= 999 ) MinorVersion
300+ IF ( PATCH_IDX .NE. LEN (TRIM (tString)) ) THEN
301+ READ (tString(PATCH_IDX+1 :END_IDX-1 ),' (I)' , ERR= 999 ) PatchVersion
302+ ELSE
303+ PatchVersion = 0
304+ ENDIF
305+
273306 IF ( BFIOErrorCode .EQ. 1 ) GOTO 999
274307 ! If read, store program version for later reference
275- IF (RW .EQ. cRead) THEN
276- ! Convert version string to real, include patch level
277- READ (tString(6 :8 ),* , ERR= 999 ) VerFig
278- IF ( tString(9 :9 ) .EQ. " " ) THEN
279- Version = tString(1 :8 )
280- ELSE
281- Version = tString(1 :10 )
282- READ (tString(10 :10 ),* ) PatchLevel
283- VerFig = VerFig + PatchLevel / 100.0
284- ENDIF
285- ENDIF
308+
286309! Read / Write radiation source
287310 CALL FileRWInteger(hPrjFile, iPrjRecNr, RW, JRadOption)
288311! Read / Write Wavelength
@@ -392,7 +415,7 @@ LOGICAL FUNCTION PrjReadWriteImpl(ThePrjFile, ReadOrWrite, ForceOldVersion)
392415! Must read/write hydrogen treatment first, because that is necessary to
393416! calculate the atomic weightings. This wasn't written out in version 3.0, so need
394417! to add a check.
395- IF ( (RW .EQ. cWrite) .OR. (Version( 6 : 8 ) .NE. " 3.0 " ) ) THEN
418+ IF ( (RW .EQ. cWrite) .OR. (MajorVersion .LE. 3 ) .OR. (MajorVersion .EQ. 3 .AND. MinorVersion .EQ. 0 ) ) THEN
396419 IF ( .NOT. ForceOldVersion ) THEN
397420 CALL FileRWInteger(hPrjFile, iPrjRecNr, RW, HydrogenTreatment)
398421 IF ( BFIOErrorCode .EQ. 1 ) GOTO 999
@@ -417,7 +440,7 @@ LOGICAL FUNCTION PrjReadWriteImpl(ThePrjFile, ReadOrWrite, ForceOldVersion)
417440 CALL SA_Parameter_Set
418441 ENDIF
419442! Read / Write MDB and SA Distance restraints. Version 3.2 onward
420- IF ( (RW .EQ. cWrite) .OR. (VerFig .GT. 3.2 - TOLER) ) THEN
443+ IF ( (RW .EQ. cWrite) .OR. (MajorVersion .GT. 3 ) .OR. (MajorVersion .EQ. 3 .AND. MinorVersion .GE. 2 ) ) THEN
421444 CALL PrjReadWriteParameterBoundsIncludeMDB
422445 IF ( BFIOErrorCode .EQ. 1 ) GOTO 999
423446 CALL PrjErrTrace
0 commit comments