! Prototype to read in SMS 11.xx map file and manipulate vertices ! Input: old.map ! Output: new.map ! pgf90 -O2 -mcmodel=medium -Mbounds -Bstatic -o place_vertices place_vertices.f90 integer, parameter :: mx_vert=10000 !max # of vertices along any arc integer, parameter :: mx_nodes=10000 !max # of nodes integer, parameter :: mx_arcs=10000 !max # of arcs character(len=100) :: line_str,str_tmp,str_tmp2 character(len=2) :: char2 character(len=5) :: char5 integer :: line_node(2),line_arc(2),iarc_nodes(2,mx_arcs),nvert(mx_arcs),node_id(mx_nodes) real :: xy_nodes(2,mx_nodes),xy_vert(2,mx_vert,mx_arcs) !Test memory xy_vert(2,mx_vert,mx_arcs)=0 ! Scan open(16,file='new.map',status='replace') open(15,file='old.map',status='old') nline=0 line_node(:)=0 !start and end line # for reading node section line_arc(:)=0 ifl_node=0 !flag ifl_arc=0 !flag do read(15,'(a)',end=99)line_str nline=nline+1 line_str=adjustl(line_str) !place blanks at end len_str=len_trim(line_str) if(len_str>=4.and.line_str(1:4).eq."NODE".and.ifl_node==0) then ifl_node=1 !only read the 1st line_node(1)=nline endif if(len_str>=3.and.line_str(1:3).eq."ARC".and.ifl_arc==0) then ifl_arc=1 !only read the 1st line_arc(1)=nline line_node(2)=nline-1 !assuming 2 sections r rite after each other endif if(len_str>=6.and.line_str(1:6).eq."ENDCOV") line_arc(2)=nline-1 enddo 99 close(15) print*, nline,' lines read' print*, '1st n last lines of node list are ',line_node print*, '1st n last lines of arc list are ',line_arc if(line_node(1)*line_node(2)*line_arc(1)*line_arc(2)==0) then print*, 'Not found:',line_arc,line_node stop endif !Parse node list open(15,file='old.map',status='old') rewind(15) if(mod(line_node(2)-line_node(1)+1,4)/=0) stop 'Wrong node list' nnodes=(line_node(2)-line_node(1)+1)/4 if(nnodes>mx_nodes) then print*, 'Too many nodes(1):',i stop endif do i=1,line_node(1)-1 read(15,*) enddo !i do i=1,nnodes read(15,*) !NODE read(15,*)char2,xy_nodes(1:2,i) ! print*, char2,xy_nodes(1:2,nnodes) !Note that SMS does not number nodes consecutively read(15,*)char2,node_id(i) !ID read(15,*) !END enddo !i !Parse arc list rewind(15) do i=1,line_arc(1)-1 read(15,*) enddo !i !# of arcs narcs=0 do i=line_arc(1),line_arc(2) read(15,*)line_str line_str=adjustl(line_str) !place blanks at end len_str=len_trim(line_str) if(len_str>=12.and.line_str(1:len_str).eq."ARCELEVATION") then narcs=narcs+1 if(narcs>mx_arcs) then print*, 'Too many arcs:',i stop endif endif enddo !i print*, narcs,' arcs found' !Redo rewind(15) do i=1,line_arc(1)-1 read(15,*) enddo !i nvert=0 do i=1,narcs read(15,*) !ARC read(15,*) !ID read(15,*) !ARCELEVATION read(15,*)char5,iarc_nodes(1:2,i) !NODES print*, char5,iarc_nodes(1:2,i) read(15,'(a)')line_str line_str=adjustl(line_str) !place blanks at end len_str=len_trim(line_str) print*, line_str !,line_str(1:len_str),len_str if(len_str>=3.and.line_str(1:3).eq."END") then else !ARCVERTICES loc=index(line_str,' ') read(line_str(loc+1:len_str),*)nvert(i) if(nvert(i)>mx_vert) then print*, 'Too many vertices:',i stop endif do k=1,nvert(i) read(15,*)xy_vert(1:2,k,i) print*, xy_vert(1:2,k,i) enddo !k read(15,*) !END endif enddo !i !Check rewind(15) do i=1,line_node(1)-1 read(15,'(a)')line_str write(16,*)line_str enddo do i=1,nnodes write(16,*)'NODE' write(16,*)'XY',xy_nodes(1:2,i),0. write(16,*)'ID',node_id(i) write(16,*)'END' enddo !i do i=1,narcs write(16,*)'ARC' write(16,*)'ID',i write(16,*)'ARCELEVATION',0. write(16,*)'NODES',iarc_nodes(1:2,i) if(nvert(i)>0) then write(16,*)'ARCVERTICES',nvert(i) do k=1,nvert(i) write(16,*)xy_vert(1:2,k,i),0. enddo !k endif write(16,*)'END' enddo !i do i=line_node(1),line_arc(2) read(15,*) enddo !i do i=line_arc(2)+1,nline read(15,'(a)')line_str write(16,*)line_str enddo !i stop end