- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Dear All,
I was wondering if the issue of allocatable,
deferred-length character variables in namelist has
been finally solved in most recent versions of
ifort.
I think the issue was brought up back in 2016
(there might be some post on some Intel forum)
and Steve Lionel promptly replied and confessed
such request was lukewarmly received by the standard
committed and later dismissed.
It would be nice to have this feature
(character(len=:),allocatable allowed in namelist)
thoroughly supported by the compiler.
Enclosed at the bottom of this note you can find a
code snippet with its associated log.
The code would compile with the following
activated:
character(len=:) , allocatable :: AllIsStoredHere,TempStuff
but would error immediately.
This is the ifort version I have been running:
[cabbonda@descartes TestNamelist]$ ifort --version ifort (IFORT) 18.0.0 20170811 Copyright (C) 1985-2017 Intel Corporation. All rights reserved.
This is the log of the code when the declaration
character(len=:) , allocatable :: AllIsStoredHere,TempStuff
is turned off.
[cabbonda@descartes TestNamelist]$ TestNamelist.e ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~ Namelist iostat = 0 ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~ &DEFINEDIRS ALLISSTOREDHERE = EccoRespiroAppena , TEMPSTUFF = TuCheLeVanitaConoscestiDelMondo / ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~ Deferred-length Character = MiaMadreAveaUnaPoveraAncella ... and its length ... 28 ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~
I would appreciate if you could provide some insight into the matter.
Thanks in advance for your help,
-claudio
And here you can find the code snippet:
program TestNamelist implicit none integer :: inml, iErr logical :: lErr character(len=50) :: AllIsStoredHere,TempStuff !character(len=:) , allocatable :: AllIsStoredHere,TempStuff character(len=:) , allocatable :: DoesThisWork namelist /DefineDirs/ AllIsStoredHere,TempStuff open(newunit=inml,& file='TestThisNamelist.nml',& status='unknown',& iostat=iErr) write(unit=*,fmt='(/,a)') ' ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~' write(unit=*,fmt='(a,1x,i2)') ' Namelist iostat = ' , iErr write(unit=*,fmt='(a,/)') ' ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~' ! Read nml read(unit=inml,nml=DefineDirs) ! Print nml to stout write(unit=*,nml=DefineDirs) !Let's automatically allocate this string DoesThisWork= 'MiaMadreAveaUnaPoveraAncella' write(unit=*,fmt='(/,a)') ' ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~' write(unit=*,fmt='(a,1x,a)') ' Deferred-length Character = ',DoesThisWork write(unit=*,fmt='(a,1x,i5)') ' ... and its length ... ',len(DoesThisWork) write(unit=*,fmt='(a,/)') ' ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~' end program TestNamelist !Content of the File TestThisNamelist.nml !$DefineDirs !AllIsStoredHere = 'EccoRespiroAppena' !TempStuff = 'TuCheLeVanitaConoscestiDelMondo' !$end
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Assuming that I have understood your question correctly: I am using Intel ifort 18.0.2.185 Build 20180210, and the allocatable characters seems to work inside namelists. All I needed to add was to allocate the two character variables prior to reading them from the namelist. Once read, one can trim and reallocate them properly to contain only the relevant characters (This trimming approach could be problematic for charatcer variables that contain trailing blanks, though). Here is the modified code:
program TestNamelist implicit none integer :: inml, iErr logical :: lErr !character(len=50) :: AllIsStoredHere,TempStuff character(len=:) , allocatable :: AllIsStoredHere,TempStuff character(len=:) , allocatable :: DoesThisWork namelist /DefineDirs/ AllIsStoredHere,TempStuff open(newunit=inml,& file='TestThisNamelist.nml',& status='unknown',& iostat=iErr) write(unit=*,fmt='(/,a)') ' ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~' write(unit=*,fmt='(a,1x,i2)') ' Namelist iostat = ' , iErr write(unit=*,fmt='(a,/)') ' ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~' ! allocate character variables: allocate( character(1023) :: AllIsStoredHere ) allocate( character(1023) :: TempStuff ) ! Read nml read(unit=inml,nml=DefineDirs) AllIsStoredHere = trim(adjustl(AllIsStoredHere)) TempStuff = trim(adjustl(TempStuff)) ! Print nml to stout write(unit=*,nml=DefineDirs) !Let's automatically allocate this string DoesThisWork= 'MiaMadreAveaUnaPoveraAncella' write(unit=*,fmt='(/,a)') ' ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~' write(unit=*,fmt='(a,1x,a)') ' Deferred-length Character = ',DoesThisWork write(unit=*,fmt='(a,1x,i5)') ' ... and its length ... ',len(DoesThisWork) write(unit=*,fmt='(a,/)') ' ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~' end program TestNamelist !Content of the File TestThisNamelist.nml !$DefineDirs !AllIsStoredHere = 'EccoRespiroAppena' !TempStuff = 'TuCheLeVanitaConoscestiDelMondo' !$end
and here is the output:
>a.out ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~ Namelist iostat = 0 ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~ &DEFINEDIRS ALLISSTOREDHERE = EccoRespiroAppena, TEMPSTUFF = TuCheLeVanitaConoscestiDelMondo / ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~ Deferred-length Character = MiaMadreAveaUnaPoveraAncella ... and its length ... 28 ~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~~o^o~

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page