ccccccc	Programa per a calcular la representacio vertical oblicua
	real*8 matriu1,matriu2,matriu_fi,extrems,matriu_punts
	real*8 pendent,val
	integer i,j,k,l,ijk
	integer dimx,dimy,n_variable,extrems_Int,direccio
	integer punts_ent,punts_tot,n_arxiu00,n_ubicacio
	character*1 direccio_S
	character*4 extrem
	character*6 extrems_S
	character*14 data
	character*10 variable
	character*80 arxiu00,arxiu_mat
	character*200 ubicacio
	dimension matriu1(300,300),matriu2(300,300),matriu_fi(300,300)
	dimension matriu_punts(2,90000),punts_ent(3)
	dimension extrems(2),extrems_Int(2),extrems_S(2)
	
ccccccccccccccc	Variables
c	matriu1: Matriu vertical de la variable abans del punt a calcular
c	matriu2: Matriu vertical de la variable despres del punt a calcular
c	martriu_fi: Matriu vertical resultant despres de ponderar els valors als
c   punts situats entre punts de malla
c	matriu_punts: Matriu amb les coordenades dels punts del tall oblicuo que
c   seran calculats per ponderacio segons la referencia dels punts extrems
c	ubicacio: Subdirectori amb les dades
c	n_ubicacio: Nombre de caracters d'ubicacio
c	data: Data de les matrius
c	direccio: Determina la direccio del tall vertical W-E: 1; N-S: 2
c	direccio_S: Caracter del tipus d'arxiu que tindrem segons el tall
c   (r:row, c:column)
c	variable: Variable per la qual tenim el tall
c	n_variable: Nombre de caracters de variable
c	extrems: Extrems (segons la direccio) del tall. Valors en la direccio
c   perpendicular a la del tall
c	extrems_Int: Vector amb els extrems dels talls en Integer
c	extrem: Valor de l'extrem de la matriu a obrir en String
c	extrems_S: Extrems passats a String
c	arxiu00: Nom d'arxiu d'entrada per a tenir les dimensions de les matrius
c	n_arxiu00: Nombre de caracters d'arxiu00
c	pendent: Pendent de la recta que uneix els dos punts extrems del tall
c	punts_ent: Punts que tenim a l'entorn del punt de calcul: col1: abans;
c   col2: despres
c	punts_tot: Nombre de punts de la matriu del tall obliquo
c	arxiu_mat: Nom de l'arxiu de la matriu per a carregar

ccccccccccccccc	Subroutines
c	llegir_configuracio: Carrega la configuracio del programa segons
c   'inf_tall_oblic.txt'
c	dimensions: Calcula les dimensions de la matriu de dades
c	I_S4: Tranforma de Integer a String de quatre caracters
c	carregar_matriu: Carrega la matriu determinada
c	calcular_valor: Calcula el valor ponderat entre dos punts pertanyents a
c   dues matrius successives
c	R_S4_2: Transforma d'un Real a un string de dos decimals 

	call llegir_configuracio(ubicacio,data,direccio,variable,extrems)
	
	if (direccio.eq.1) direccio_S='r'
	if (direccio.eq.2) direccio_S='c'
	
	n_variable=0
	do i=1,10
	if ((ichar(variable(i:i))-48).ne.(-16)) n_variable=n_variable+1
	enddo

	if (extrems(1).gt.extrems(2)) then
	extrems_Int(1)=int(extrems(1)+1)
	extrems_Int(2)=int(extrems(2)-1)
	else
	extrems_Int(1)=int(extrems(1)-1)
	extrems_Int(2)=int(extrems(2)+1)	
	endif
	
	call I_S4(extrems_Int(1),extrem)

	arxiu00=data(1:2) // data(4:5) // data(7:8) // data(10:11) //
     &data(13:14)//'-GNU'//variable(1:n_variable)//'-'//direccio_S//
     &extrem//'.grd'
	n_arxiu00=0
	do i=1,80
	if ((ichar(arxiu00(i:i))-48).ne.(-16)) n_arxiu00=n_arxiu00+1
	enddo
	
	call dimensions(arxiu00,ubicacio,dimx,dimy)	

	ijk=1

cccc
c
c	Compte !!!!
c(vis5d?)
	pendent=(extrems(2)-extrems(1))/dimx 
c
c(altres)
c	pendent=(extrems(2)-extrems(1))/dimy

	write(6,*)'Pendent unio punts ',pendent
	do i=1,dimx+1
	do j=1,dimy
	matriu_punts(1,ijk)=extrems(1)+pendent*(i-1)
	matriu_punts(2,ijk)=j
	ijk=ijk+1
	enddo
	enddo
	punts_tot=ijk-1

	write(6,*)'Calculant els valors ponderats...'
	ijk=1
	do i=1,punts_tot,dimy
	k=i/dimy+1
	punts_ent(1)=matriu_punts(1,i)
	punts_ent(2)=matriu_punts(1,i)+1
	
	call I_S4(punts_ent(1),extrem)
	arxiu_mat=arxiu00(1:n_arxiu00-8)//extrem//'.grd'
c	write(6,*)'Carregant arxius...'
c	write(6,*)arxiu_mat
	call carregar_matriu(ubicacio,arxiu_mat,dimx,dimy,matriu1)
	
	call I_S4(punts_ent(2),extrem)
	arxiu_mat=arxiu00(1:n_arxiu00-8)//extrem//'.grd'
c	write(6,*)arxiu_mat
	call carregar_matriu(ubicacio,arxiu_mat,dimx,dimy,matriu2)

	do j=1,dimy
c	write(6,*)'PUNTS: ',j,k,(matriu_punts(l,ijk),l=1,2)
	call calcular_valor(matriu1(j,k),matriu2(j,k),matriu_punts(1,ijk)
     &,matriu_fi(j,k))
	ijk=ijk+1
	enddo
	enddo

	call R_S4_2(extrems(1),extrems_S(1))
	call R_S4_2(extrems(2),extrems_S(2))	

	arxiu00=data(1:2) // data(4:5) // data(7:8) // data(10:11) //
     &data(13:14)//'-GNU'//variable(1:n_variable)//'-'//direccio_S//
     &extrems_S(1)//'_'//extrems_S(2)//'.grd'

	n_arxiu00=0
	do i=1,80
	if ((ichar(arxiu00(i:i))-48).ne.(-16)) n_arxiu00=n_arxiu00+1
	enddo
	
	n_ubicacio=0
	do i=1,80
	if ((ichar(ubicacio(i:i))-48).ne.(-16)) n_ubicacio=n_ubicacio+1
	enddo
	
	write(6,*)'Guardant matriu del tall oblic...'
	write(6,*)arxiu00(1:n_arxiu00)
	open(unit=7,file=ubicacio(1:n_ubicacio)//char(47)//
     &arxiu00(1:n_arxiu00),status='unknown')
	do i=1,dimx
	write(7,20)(matriu_fi(j,i),j=1,dimy)
  20	format(300(E20.10,1x))
c  20	format(300(f20.10,1x))
c  20	format(300(E16.6))
	enddo
	close(unit=7)

	write(6,*)'Guardant coordenades del tall oblic...'
	write(6,*)arxiu00(1:n_arxiu00-4)//'.tall'
	open(unit=8,file=ubicacio(1:n_ubicacio)//char(47)//
     &arxiu00(1:n_arxiu00-4)//'.tall',status='unknown')
cccc
c
c	Compte !!!!
c(vis5d ?)
	do i=1,dimx 
c
c(altres)
c	do i=1,dimy
c
	write(8,30)extrems(1)+pendent*(i-1),i*1.
  30	format(2(E20.10,1x))
	enddo
	close(unit=8)

	end

ccccccc	SUBROTUINA que passa d'un real a un String amb 2 decimals
     	subroutine R_S4_2(real,String)
	real*8 real
	integer Cr,Dr,Ur,Decr,Cenr
	character*6 String
	
	Cr=real/100
	Dr=(real-Cr*100)/10
	Ur=(real-Cr*100-Dr*10)/1.
	Decr=(real-Cr*100-Dr*10-Ur*1.)/0.1
	Cenr=(real-Cr*100-Dr*10-Ur*1.-Decr*0.1)/0.01
	
	String=char(48+Cr)//char(48+Dr)//char(48+Ur) // '.' // 
     &char(48+Decr) // char(48+Cenr)

	end

ccccccc	SUBROUTINA per a calcular el valor ponderat al punt
	subroutine calcular_valor(val_ant,val_pos,punt,valor)
	real*8 val_ant,val_pos,punt,valor
	real*8 pendent_val,dist
	integer i,j
	integer punt0
	
	pendent_val=val_pos-val_ant
	punt0=punt
	dist=punt-punt0
	valor=val_ant+dist*pendent_val
	
c	write(6,*)'Calculem per al punt ',punt,' per als valors ',
c     &val_ant,val_pos,' distancia al punt inicial ',dist,' pendent ',
c     &pendent_val
c     	write(6,*)'RESULTAT :',valor

	end

ccccccc	SUBROUTINA per a carregar en memoria una matriu
	subroutine carregar_matriu(ubic,ar,dx,dy,matriu)
	real*8 matriu
	integer i,j
	integer n_ubic,n_ar,dx,dy
	character*80 ar
	character*200 ubic
	dimension matriu(300,300)
	
	n_ar=0
	do i=1,80
	if ((ichar(ar(i:i))-48).ne.(-16)) n_ar=n_ar+1
	enddo
	
	n_ubic=0
	do i=1,200
	if ((ichar(ubic(i:i))-48).ne.(-16)) n_ubic=n_ubic+1
	enddo
	
	open(unit=8,file=ubic(1:n_ubic)//char(47)//ar(1:n_ar),
     &status='old') 
	
	do i=1,dx
	read(8,10)(matriu(j,i),j=1,dy)
c  10	format(300(E20.10,1x))
  10	format(300(E16.6))
	enddo
	
	close(unit=8)
	
	end

ccccccc	SUBROUTINA per a passar d'integer a String de 4 caracters
	subroutine I_S4(Int,Str)
	integer Int,IM,IC,ID,IU
	character*4 Str
	
	IM=Int/1000
	IC=(Int-IM*1000)/100
	ID=(Int-IM*1000-IC*100)/10
	IU=Int-IM*1000-IC*100-ID*10
	
	Str=char(IM+48)//char(IC+48)//char(ID+48)//char(IU+48)
	end

ccccccc	SUBROUTINA per a llegir les dades i buscar-ne la seva dimensio
	subroutine dimensions(arxiu,ubic,dx,dy)
	real*8 dad,min
	integer i,j
	integer dx,dy,n_ar,n_u,p1,p2,punt
	character*120 arxiu
	character*200 ubic
	character*5000 linia 
	dimension dad(300,300)
	
	n_ar=0
	do i=1,80
	if ((ichar(arxiu(i:i))-48).ne.(-16)) n_ar=n_ar+1
	enddo
	
	n_u=0
	do i=1,200
	if ((ichar(ubic(i:i))-48).ne.(-16)) n_u=n_u+1
	enddo

	dx=0
	dy=0
	open(unit=3,file=ubic(1:n_u) // char(47) // arxiu(1:n_ar)
     &,status='old')
	do i=1,300
	read(3,*,end=100)min
	dx=dx+1
	enddo
  100	continue
  	close(unit=3)
	
	open(unit=3,file=ubic(1:n_u) // char(47) // arxiu(1:n_ar)
     &,status='old')
	min=100.
	max=-100.
	
	do i=1,dx
	read(3,50)(dad(i,j),j=1,300)
  50	format(300(E16.6))
c  50 	format(300(f20.10,1x))
c  50 	format(300(E20.10,1x))
	enddo
	close(unit=3)
	
	open(unit=3,file=ubic(1:n_u) // char(47) // arxiu(1:n_ar)
     &,status='old')
	
	read(3,70)linia
  70 	format(5000a)

	close(unit=3)

	p1=0
	p2=0
	do i=1,50
	if (((ichar(linia(i:i))-48).eq.(-2)).and.(p1.ne.0)) then 
	p2=i
	goto 200
	endif
	if (((ichar(linia(i:i))-48).eq.(-2)).and.(p1.eq.0)) p1=i
	enddo
 200	continue

	punt=p1
	dy=1
	do i=1,5000
	if ((ichar(linia(i:i))-48).eq.(-2)) then
	punt=i
	if ((ichar(linia(punt+p2-p1:punt+p2-p1))-48).eq.(-2)) dy=dy+1
	if ((ichar(linia(punt+p2-p1:punt+p2-p1))-48).eq.(-16)) goto 300
	endif
	enddo
 300	continue
 	write(6,*)'La dimensio de la matriu ',dx,' x ',dy
	end

	
ccccccc	SUBROUTINA per a llegir la configuracio a 'inf_tal_oblic.txt'
	subroutine llegir_configuracio(ubic,date,dir,var,ext)
	real*8 ext
	integer dir
	character*10 var
	character*14 date,linia
	character*200 ubic
	dimension ext(2)
	
	open(unit=1,file='inf_tall_oblic.txt',status='old')
	read(1,30)linia
	read(1,30)linia	
	read(1,20)ubic
	read(1,30)linia
	read(1,30)linia	
	read(1,30)date
	read(1,30)linia
	read(1,30)linia	
	read(1,*)dir	
	read(1,30)linia
	read(1,30)linia	
	read(1,10)var
	read(1,30)linia
	read(1,30)linia	
	read(1,*)ext(1)
	read(1,*)ext(2)
	
  10	format(a10)
  20	format(a200)
  30	format(a14)

	close(unit=1)
	
	write(6,*)'		Tenim :'
	write(6,*)'Ubicacio arxius ',ubic
	write(6,*)'Data del tall ',date
	write(6,*)'Variable ',var
	write(6,*)'Extrems del tall ',ext
	
	end
