allocate (tsrc(itsrc), stat = ierr)
call checkerr(ierr,'tsrc',ilog)
allocate (totco(itemp), stat = ierr)
call checkerr(ierr,'totco',ilog)
c define pointer to first target time for reading source chemistry
itsrc = 1
c read the data in *.chm file.
do itsrc = 1,ntsrc
read(ichm,*,err=999,end=999) tsrc(itsrc)
end do
do ic = 1,nc-1
itemp = ncorder(ic)
read(ichm,*,err=999,end=999) totco(itemp)
end do
read(ichm,*,err=999,end=999) phguess
ctype(itemp) = 'free'
배열에 관한 설명이 부족한 듯 해서 조금 더 적습니다...
첫 행의 tsrc(itsrc)에 들어있는 숫자 정보는, 화합물을 포함한 물이 시스템에 유입되는 지정된 시간입니다. 위에서는 일단 0.25 와 0.50 day로 되어 있는데 이를 시간으로 바꾸면 각각 6시간과 12시간이 되겠습니다. 이 배열은 allocatable array로 설정이 되어 있는데, 일단 초기 시뮬레이션 목적으로 최대한 간단하게 2개만 했습니다.
두번째 세번째열의 totco(itemp)도 역시 allocatable array로 설정이 되어 있습니다. itemp=1, nc-1 로 굳이 설정을 해야 하는 이유는 이 소프트웨어의 중요한 임무중의 하나가 시스템으로 유입되는 화합물의 농도를 계산하는 것인데 (때로는 N이나 P와 같은 토양 양료가 될 수도 있고 때로는 중금속혹은 다른 오염물질이 될 수도 있습니다... 보통 30개 전후의 화합물들을 다루고 있는데 역시 초기 시뮬레이션 목적으로 2개만 했습니다) 이 화합물의 순서및 종류를 먼저 지정해 놓고 여러 차례의 계산에 이용하게 됩니다...
끝에 pH 한 열을 더 넣어야 해서, 이 부분만의 increment를 어떻게 처리해야 할지 좀 난감하거든요… 제가 확실치 않았던 것이, 이렇게 4개의 열이 있을때 do 문을 써서 열별로 차례로 읽을 수가 있는건지 하는 건데... 일단 위와 같이 해 보았는데... 아직은 안되네요... 조언좀 부탁드립니다.
첫댓글아무리 읽어봐도 이해가 안 된다는...data file에서 한줄에 4개의 data 값이 있는 것인가요? day 에 대한 숫자 정보, mol/L 에 대한 숫자 정보 2개, 마지막이 pH 값인가요? 이 data file 마지막에 data 를 한개 더 추가 하고 싶다... 이런 의미인가요? 하고자 하시는 것이 어떤 것인지 명확하게 모르겠어요. T.T
음... 따로 따로 읽어 드리지 마시고 통째로 읽어 들이는 방법도 있습니다. 제가 이해를 잘못했는지 몰라도 결국은 저 위의 데이터 끝에 pH 값 하나만 넣으면 되는 거 맞죠? do i = 1, 2 / read(ichm,'(a40)') temp(i) / end do 이렇게 읽어 들이면 위의 데이터 한줄을 문자형으로 간주해서 읽게 됩니다.
즉, temp(1)에는 위 데이터 첫번째 줄의 내용이 담기게 되죠. 나중에 write(*,*) temp(i), pH 이런 식으로 하면 위 데이터의 끝에 pH값을 넣을 수 있습니다. 원하시는 내용이 맞는지 모르겠습니다. 위의 a40 format 은 데이터의 자리수를 보니까 40개라서 거기에 맞춰 설정을 했습니다.
아... 그렇군요... 그런데 첫번째 열의 데이터를 읽어서 4개의 서브루틴으로 보내고, 두번째 세번째의 데이터를 읽어서 11개의 서브루틴으로 보내며, 마지막 pHguess 데이터를 읽어서 3개의 서브루틴으로 보내어 함유된 화합물의 농도를 계산하는 것이라... 따로 읽는 것도 고려를 해 보아야 할 거 같습니다 .
다시 보니 아직도 제 많이 설명이 부족한거 같네요. 위의 데이터의 내용을 살펴보면 6시간째에 pH 5.0의 solution을 통해 2.0d+02 mol/L의 농도의 첫번째 화합물과 1.0d+02 mol/L의 농도의 두번째 화합물이 들어가게 되고 두번째 시간에도 이런 식으로 되게됩니다. 연말이라 바쁘실텐데 조언 감사합니다. ^^
데이터가 위의 예제와 같다면 format 을 이용하시면 됩니다. 문자부분은 위와 같은 방식으로 중간에 읽어 들이면 될거 같습니다. format(f4.1,a4,2(1pe7.1,a5),f3.1)이런 식으로요. 물론 중간에 character에 대한 것은 필요하지 않기 때문에 dummy variable을 하나 선언하면 될거 같습니다. format문은 책을 참고하세요. ^^
첫댓글 아무리 읽어봐도 이해가 안 된다는...data file에서 한줄에 4개의 data 값이 있는 것인가요? day 에 대한 숫자 정보, mol/L 에 대한 숫자 정보 2개, 마지막이 pH 값인가요? 이 data file 마지막에 data 를 한개 더 추가 하고 싶다... 이런 의미인가요? 하고자 하시는 것이 어떤 것인지 명확하게 모르겠어요. T.T
음... 따로 따로 읽어 드리지 마시고 통째로 읽어 들이는 방법도 있습니다. 제가 이해를 잘못했는지 몰라도 결국은 저 위의 데이터 끝에 pH 값 하나만 넣으면 되는 거 맞죠? do i = 1, 2 / read(ichm,'(a40)') temp(i) / end do 이렇게 읽어 들이면 위의 데이터 한줄을 문자형으로 간주해서 읽게 됩니다.
즉, temp(1)에는 위 데이터 첫번째 줄의 내용이 담기게 되죠. 나중에 write(*,*) temp(i), pH 이런 식으로 하면 위 데이터의 끝에 pH값을 넣을 수 있습니다. 원하시는 내용이 맞는지 모르겠습니다. 위의 a40 format 은 데이터의 자리수를 보니까 40개라서 거기에 맞춰 설정을 했습니다.
아... 그렇군요... 그런데 첫번째 열의 데이터를 읽어서 4개의 서브루틴으로 보내고, 두번째 세번째의 데이터를 읽어서 11개의 서브루틴으로 보내며, 마지막 pHguess 데이터를 읽어서 3개의 서브루틴으로 보내어 함유된 화합물의 농도를 계산하는 것이라... 따로 읽는 것도 고려를 해 보아야 할 거 같습니다 .
다시 보니 아직도 제 많이 설명이 부족한거 같네요. 위의 데이터의 내용을 살펴보면 6시간째에 pH 5.0의 solution을 통해 2.0d+02 mol/L의 농도의 첫번째 화합물과 1.0d+02 mol/L의 농도의 두번째 화합물이 들어가게 되고 두번째 시간에도 이런 식으로 되게됩니다. 연말이라 바쁘실텐데 조언 감사합니다. ^^
데이터가 위의 예제와 같다면 format 을 이용하시면 됩니다. 문자부분은 위와 같은 방식으로 중간에 읽어 들이면 될거 같습니다. format(f4.1,a4,2(1pe7.1,a5),f3.1)이런 식으로요. 물론 중간에 character에 대한 것은 필요하지 않기 때문에 dummy variable을 하나 선언하면 될거 같습니다. format문은 책을 참고하세요. ^^
아 그리고.. 제가 데이터의 단위를 넣었던 것은 이해를 돕기 위해서이고, 실제로는 숫자들만 읽어들이면 됩니다. 다시 읽어보니 혼동의 여지가 있네요... 죄송...