program main !*****************************************************************************80 !! MAIN is the main program for KMEANS_TEST. ! Discussion: ! KMEANS_TEST tests the KMEANS library. ! Licensing: ! This code is distributed under the GNU LGPL license. ! Modified: ! 06 October 2009 ! Author: ! John Burkardt ! Use NetCDF implicit none Real, Parameter :: Rmiss=-99.0 Integer, Parameter :: Imiss=-99 Real, Allocatable :: StnID(:), X(:,:), Lon(:), Lat(:), Reg(:), xtime(:) Integer :: Nst,Ntime,i,j, irow, icol, N_Clus Real (kind=8), Allocatable :: point(:,:) ! (M,N) Real, Allocatable :: C(:,:), XX(:,:) Integer,Allocatable :: Z(:) Integer (kind=4) :: M, N, iclu, cluster_num ! Dims, Points, Num of clusters Integer (kind=4) :: Min_Obs, Max_Clu Logical :: status Integer, Allocatable :: Clus(:,:) ! (N,N_Clus) Real, Allocatable :: Clus_var(:,:) ! (N_Clus,N_Clus) Real, Allocatable :: Mean_var(:) ! (N_Clus) Real, Allocatable :: Total_Ene(:) ! (N_Clus) Integer, Allocatable :: Clus_popu(:,:) ! (N_Clus,N_Clus) Integer(kind=4), Allocatable :: Popu(:) ! (N_Clus,N_Clus) Integer(kind=4), Allocatable :: Clus_out(:) ! (N) - B Real (kind=8), Allocatable :: Vari(:) ! (N_Clus) - DEV Real (kind=8), Allocatable :: Center(:,:) ! (N_Clus,M) - D Call Read_data ! Return: X(Nst,Ntime), Lon(Nst),Lat(Nst),Reg(Nst) M=Ntime; N=Nst cluster_num=10 Min_Obs=5; Max_Clu=cluster_num Allocate (point(N,M),Popu(cluster_num),Clus_out(N),Vari(cluster_num),Center(cluster_num,M)) ! , XX(M,N)) !Do irow=1,N ! point(1:M,irow) = X(irow,1:M) ! XX(1:M,irow) = X(irow,1:M) !Enddo !cluster_num=10 !Call clustr ( point, d, Vari, Clus_out, Popu, N, M, cluster_num, 1, N ) point(:,:)=X(:,:) N_Clus=cluster_num Allocate (Clus(Nst,N_Clus),Clus_var(N_Clus,N_Clus),Clus_popu(N_Clus,N_Clus)) Allocate (Total_Ene(N_Clus),Mean_var(N_Clus)) Clus=Imiss; Clus_popu=Imiss; Clus_var=Rmiss; Mean_var=Rmiss Do j=1,N_Clus iclu=j Call clustr ( point, Center, Vari, Clus_out, Popu, N, M, iclu, Min_Obs, Max_Clu ) print*,"Case ",j Clus(1:Nst,j)=Clus_out(1:N) ! Clusters Clus_popu(1:j,j)=Popu(1:iclu) ! Population of each cluster Mean_var(j)=sum(Vari(1:iclu))/iclu Clus_var(1:j,j)=Vari(1:iclu) !Clus_popu(1:N_Clus,j)=Popu(1:cluster_num) ! Population of each cluster !Mean_var(j)=sum(Vari(1:cluster_num))/cluster_num !Clus_var(1:N_Clus,j)=Vari(1:cluster_num) Enddo ! Clusters: print*,"Clusters" print"(2A4,20(3x,A1,I2.2))","STT","Reg",(("C",i),i=1,N_Clus) Do i=1,Nst print"(2I4,20I6)",i,Int(Reg(i)),(Clus(i,1:N_Clus)) Enddo !Populations: print*,"Populations" print"(A3,20(3x,A1,I2.2))","Gr",(("C",i),i=1,N_Clus) Do i=1,N_Clus print"(I2,20I6)", i, (Clus_popu(i,1:N_Clus)) Enddo ! Variances: print*,"Variances" print"(A3,20(6x,A1,I2.2))","Gr",(("C",i),i=1,N_Clus) Do i=1,N_Clus print"(I2,20F9.2)", i, (Clus_var(i,1:N_Clus)) Enddo ! Total variances: print*,"Mean variances" print"(A3,2A12)","Gr","Mean_Var" !,"Tot_Ene" Do i=1,N_Clus print"(I2,20F12.2)", i, Mean_var(i) !, Total_Ene(i) Enddo pause Deallocate (StnID,X,Lon,Lat,Reg,xtime) Deallocate (point, Center,Vari, Clus_out, Popu) Deallocate (Clus,Clus_var,Clus_popu,Total_Ene,Mean_var) stop 0 !----------------------------------------------------------------------------- CONTAINS !-------------------------------------------------------------------- Subroutine Read_data Character (Len=200) :: Fname Fname="/home/tanpv/SEACLID_New/RES/PDSI_Res/"// & "PDSI_Stn_No_Rain_Center.nc" Call rd_ncdf_2d (Fname,StnID,Xtime,Nst,Ntime,X,"ori_pdsi") !Call rd_ncdf_2d (Fname,StnID,Xtime,Nst,Ntime,X,"Pre") Deallocate (StnID) Call rd_ncdf_1d (Fname, StnID, Nst, Lon, "lon") Deallocate (StnID) Call rd_ncdf_1d (Fname, StnID, Nst, Lat, "lat") Deallocate (StnID) Call rd_ncdf_1d (Fname, StnID, Nst, Reg, "reg") print*, Reg End Subroutine Read_data Include "/home/tanpv/Mylibs/sub_rd_ncdf_Tan.F90" !!!end !----------------------------------------------------------------------------- !Include "kmean_lib.f90" Include "kmean_asa058.f90" !----------------------------------------------------------------------------- !------------------ End Prog. ------------------ END