From 804febe7f9ea954c2c66ddeec9f56331faab2007 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 31 May 2018 18:31:44 +0200 Subject: [PATCH] WIP: separate reading in and parsing --- src/math.f90 | 3 +- src/plastic_phenopowerlaw.f90 | 113 +++++++++++++++++++++------------- 2 files changed, 71 insertions(+), 45 deletions(-) diff --git a/src/math.f90 b/src/math.f90 index f253a1b28..d53d80b40 100644 --- a/src/math.f90 +++ b/src/math.f90 @@ -160,8 +160,7 @@ module math math_rotate_forward33, & math_rotate_backward33, & math_rotate_forward3333, & - math_limit, & - math_expand + math_limit private :: & math_check, & halton diff --git a/src/plastic_phenopowerlaw.f90 b/src/plastic_phenopowerlaw.f90 index 52fcf3ad3..c70d7220d 100644 --- a/src/plastic_phenopowerlaw.f90 +++ b/src/plastic_phenopowerlaw.f90 @@ -26,14 +26,11 @@ module plastic_phenopowerlaw totalNslip, & !< no. of slip system used in simulation totalNtwin !< no. of twin system used in simulation - - real(pReal), dimension(:,:,:), allocatable, private :: & - - interaction_SlipSlip, & !< interaction factors slip - slip (input parameter) + interaction_SlipSlip, & !< interaction factors slip - slip (input parameter) interaction_SlipTwin, & !< interaction factors slip - twin (input parameter) interaction_TwinSlip, & !< interaction factors twin - slip (input parameter) - interaction_TwinTwin !< interaction factors twin - twin (input parameter) + interaction_TwinTwin !< interaction factors twin - twin (input parameter) enum, bind(c) @@ -52,7 +49,16 @@ module plastic_phenopowerlaw integer(kind(undefined_ID)), dimension(:,:), allocatable, private :: & plastic_phenopowerlaw_outputID !< ID of each post result output + type :: tKeyValues + character(len=64) :: & + key = '' + character(len=65536) :: & + rawValues = '' + end type + type, private :: tParameters !< container type for internal constitutive parameters + type(tKeyValues) :: & + keyValues real(pReal) :: & gdot0_slip, & !< reference shear strain rate for slip gdot0_twin, & !< reference shear strain rate for twin @@ -172,6 +178,9 @@ subroutine plastic_phenopowerlaw_init(fileUnit) offset_slip, index_myFamily, index_otherFamily, & mySize=0_pInt,sizeState,sizeDotState, sizeDeltaState, & startIndex, endIndex + + type(tKeyValues) :: keyValuesTemp + character(len=65536) :: & tag = '', & line = '', & @@ -184,67 +193,85 @@ subroutine plastic_phenopowerlaw_init(fileUnit) write(6,'(a15,a)') ' Current time: ',IO_timeStamp() #include "compilation_info.f90" - maxNinstance = int(count(phase_plasticity == PLASTICITY_PHENOPOWERLAW_ID),pInt) + maxNinstance = int(count(phase_plasticity == PLASTICITY_PHENOPOWERLAW_ID),pInt) ! ToDo: this does not happen if (maxNinstance == 0_pInt) return if (iand(debug_level(debug_constitutive),debug_levelBasic) /= 0_pInt) & write(6,'(a16,1x,i5,/)') '# instances:',maxNinstance - allocate(plastic_phenopowerlaw_sizePostResults(maxNinstance), source=0_pInt) - allocate(plastic_phenopowerlaw_sizePostResult(maxval(phase_Noutput),maxNinstance), & - source=0_pInt) + allocate(plastic_phenopowerlaw_sizePostResults(maxNinstance), source=0_pInt) + allocate(plastic_phenopowerlaw_sizePostResult(maxval(phase_Noutput),maxNinstance),source=0_pInt) + allocate(plastic_phenopowerlaw_Noutput(maxNinstance), source=0_pInt) allocate(plastic_phenopowerlaw_output(maxval(phase_Noutput),maxNinstance)) - plastic_phenopowerlaw_output = '' - allocate(plastic_phenopowerlaw_outputID(maxval(phase_Noutput),maxNinstance),source=undefined_ID) - - allocate(plastic_phenopowerlaw_Noutput(maxNinstance), source=0_pInt) + plastic_phenopowerlaw_output = '' + allocate(plastic_phenopowerlaw_outputID(maxval(phase_Noutput),maxNinstance),source=undefined_ID) allocate(totalNslip(maxNinstance), source=0_pInt) allocate(totalNtwin(maxNinstance), source=0_pInt) allocate(param(maxNinstance)) ! one container of parameters per instance rewind(fileUnit) phase = 0_pInt - do while (trim(line) /= IO_EOF .and. IO_lc(IO_getTag(line,'<','>')) /= material_partPhase) ! wind forward to + windForward: do while (IO_lc(IO_getTag(line,'<','>')) /= material_partPhase) line = IO_read(fileUnit) - enddo - - parsingFile: do while (trim(line) /= IO_EOF) ! read through sections of phase part + enddo windForward + getKeys: do while (trim(line) /= IO_EOF) ! read through sections of phase part line = IO_read(fileUnit) - if (IO_isBlank(line)) cycle ! skip empty lines + if (IO_isBlank(line) .or. phase == 0_pInt) cycle ! skip empty lines + if (IO_getTag(line,'[',']') /= '') phase = phase + 1_pInt ! next phase + phase = phase + 1_pInt ! advance phase section counter + instance = phase_plasticityInstance(phase) ! instance of present phase + cycle + endif + if (phase_plasticity(phase) /= PLASTICITY_PHENOPOWERLAW_ID) cycle if (IO_getTag(line,'<','>') /= '') then ! stop at next part line = IO_read(fileUnit, .true.) ! reset IO_read exit endif - if (IO_getTag(line,'[',']') /= '') then ! next phase - phase = phase + 1_pInt ! advance phase section counter - if (phase_plasticity(phase) == PLASTICITY_PHENOPOWERLAW_ID) then - instance = phase_plasticityInstance(phase) ! which instance of my plasticity is present phase - Nchunks_SlipFamilies = count(lattice_NslipSystem(:,phase) > 0_pInt) ! maximum number of slip families according to lattice type of current phase - Nchunks_TwinFamilies = count(lattice_NtwinSystem(:,phase) > 0_pInt) ! maximum number of twin families according to lattice type of current phase - Nchunks_SlipSlip = maxval(lattice_interactionSlipSlip(:,:,phase)) - Nchunks_SlipTwin = maxval(lattice_interactionSlipTwin(:,:,phase)) - Nchunks_TwinSlip = maxval(lattice_interactionTwinSlip(:,:,phase)) - Nchunks_TwinTwin = maxval(lattice_interactionTwinTwin(:,:,phase)) - Nchunks_nonSchmid = lattice_NnonSchmid(phase) - if(allocated(tempPerSlip)) deallocate(tempPerSlip) - !allocate(param(instance)%H_int,source=tempPerSlip) gfortran 5 does not support this - allocate(param(instance)%H_int(Nchunks_SlipFamilies),source=0.0_pReal) - allocate(param(instance)%interaction_SlipSlip(Nchunks_SlipSlip),source=0.0_pReal) - allocate(param(instance)%interaction_SlipTwin(Nchunks_SlipTwin),source=0.0_pReal) - allocate(param(instance)%interaction_TwinSlip(Nchunks_TwinSlip),source=0.0_pReal) - allocate(param(instance)%interaction_TwinTwin(Nchunks_TwinTwin),source=0.0_pReal) - allocate(param(instance)%nonSchmidCoeff(Nchunks_nonSchmid),source=0.0_pReal) + chunkPos = IO_stringPos(line) + keyValuesTemp%key = IO_lc(IO_stringValue(line,chunkPos,1_pInt)) ! extract key + if(chunkPos(1) > 1) keyValuesTemp%rawValues = IO_lc(line(chunkPos(4),:)) + param(instance)%keyValues = [(instance)%keyValues,keyValuesTemp] + enddo getKeys - allocate(tempPerSlip(Nchunks_SlipFamilies)) - endif - cycle ! skip to next line + parseString: do instance = 1_pInt, maxNinstance + do i = 1_pInt, size(param(instance)%keyValues); key = param(instance)%keyValues(i) + enddo + enddo parseStrings + + myPhase: if (phase_plasticity(phase) == PLASTICITY_phenopowerlaw_ID) then + instance = phase_plasticityInstance(phase) + + ! if (phase_plasticity(phase) == PLASTICITY_PHENOPOWERLAW_ID) then + ! instance = phase_plasticityInstance(phase) ! which instance of my plasticity is present phase + ! chunkPos = IO_stringPos(line) + ! configTemp%key = IO_lc(IO_stringValue(line,chunkPos,1_pInt)) ! extract key + ! if(chunkPos(1) > 1) configTemp%rawValues = IO_lc(line(chunkPos(4),:)) + ! config = [config,configTemp] + + ! Nchunks_SlipFamilies = count(lattice_NslipSystem(:,phase) > 0_pInt) ! maximum number of slip families according to lattice type of current phase + ! Nchunks_TwinFamilies = count(lattice_NtwinSystem(:,phase) > 0_pInt) ! maximum number of twin families according to lattice type of current phase + ! Nchunks_SlipSlip = maxval(lattice_interactionSlipSlip(:,:,phase)) + ! Nchunks_SlipTwin = maxval(lattice_interactionSlipTwin(:,:,phase)) + ! Nchunks_TwinSlip = maxval(lattice_interactionTwinSlip(:,:,phase)) + ! Nchunks_TwinTwin = maxval(lattice_interactionTwinTwin(:,:,phase)) + ! Nchunks_nonSchmid = lattice_NnonSchmid(phase) + ! if(allocated(tempPerSlip)) deallocate(tempPerSlip) + ! !allocate(param(instance)%H_int,source=tempPerSlip) gfortran 5 does not support this + ! allocate(param(instance)%H_int(Nchunks_SlipFamilies),source=0.0_pReal) + ! allocate(param(instance)%interaction_SlipSlip(Nchunks_SlipSlip),source=0.0_pReal) + ! allocate(param(instance)%interaction_SlipTwin(Nchunks_SlipTwin),source=0.0_pReal) + ! allocate(param(instance)%interaction_TwinSlip(Nchunks_TwinSlip),source=0.0_pReal) + ! allocate(param(instance)%interaction_TwinTwin(Nchunks_TwinTwin),source=0.0_pReal) + ! allocate(param(instance)%nonSchmidCoeff(Nchunks_nonSchmid),source=0.0_pReal) + + ! allocate(tempPerSlip(Nchunks_SlipFamilies)) + ! endif + ! cycle ! skip to next line endif if (phase > 0_pInt ) then; if (phase_plasticity(phase) == PLASTICITY_PHENOPOWERLAW_ID) then ! one of my phases. Do not short-circuit here (.and. between if-statements), it's not safe in Fortran - - chunkPos = IO_stringPos(line) - tag = IO_lc(IO_stringValue(line,chunkPos,1_pInt)) ! extract key + tag = IO_lc(IO_stringValue(line,chunkPos,1_pInt)) ! extract key select case(tag) case ('(output)')