/* nag_wav_dim3_sngl_fwd (c09fac) Example Program. * * Copyright 2025 Numerical Algorithms Group. * * Mark 31.1, 2025. */ #include<math.h> #include<nag.h> #include<stdio.h> #define A(I, J, K) a[I - 1 + (J - 1) * lda + (K - 1) * lda * sda] #define B(I, J, K) b[I - 1 + (J - 1) * ldb + (K - 1) * ldb * sdb] #define D(I, J, K) d[I - 1 + (J - 1) * nwcm + (K - 1) * nwcm * nwcn] intmain(void){ /* Scalars */ Integerexit_status=0,zero=0; Integercindex,i,j,k,lda,ldb,lenc; Integerm,n,fr,nf,nwcfr,nwcm,nwcn,nwct,nwl,sda,sdb; /* Arrays */ charmode[25],wavnam[25]; double*a=0,*b=0,*c=0,*d=0; Integericomm[260]; /* Nag Types */ Nag_Waveletwavnamenum; Nag_WaveletModemodenum; Nag_MatrixTypematrix=Nag_GeneralMatrix; Nag_OrderTypeorder=Nag_ColMajor; Nag_DiagTypediag=Nag_NonUnitDiag; NagErrorfail; INIT_FAIL(fail); printf("nag_wav_dim3_sngl_fwd (c09fac) Example Program Results\n\n"); fflush(stdout); /* Skip heading in data file and read problem parameters */ scanf("%*[^\n] %"NAG_IFMT"%"NAG_IFMT"%"NAG_IFMT"%*[^\n]",&m,&n,&fr); lda=m; ldb=m; sda=n; sdb=n; scanf("%24s%24s%*[^\n]\n",wavnam,mode); if(!(a=NAG_ALLOC((lda)*(sda)*(fr),double))|| !(b=NAG_ALLOC((ldb)*(sdb)*(fr),double))){ printf("Allocation failure\n"); exit_status=1; gotoEND; } printf("Parameters read from file :: \n"); printf("DWT :: Wavelet : %s\n",wavnam); printf(" End mode : %s\n",mode); printf(" m : %4"NAG_IFMT"\n",m); printf(" n : %4"NAG_IFMT"\n",n); printf(" fr : %4"NAG_IFMT"\n\n",fr); /* nag_enum_name_to_value (x04nac). * Converts NAG enum member name to value */ wavnamenum=(Nag_Wavelet)nag_enum_name_to_value(wavnam); modenum=(Nag_WaveletMode)nag_enum_name_to_value(mode); /* Read data array */ for(k=1;k<=fr;k++){ for(i=1;i<=m;i++){ for(j=1;j<=n;j++) scanf("%lf",&A(i,j,k)); } scanf("%*[^\n] "); } /* Print out the input data */ printf("Input Data :\n"); fflush(stdout); for(k=1;k<=fr;k++){ /* nag_file_print_matrix_real_gen_comp (x04cbc). * Prints out a matrix. */ nag_file_print_matrix_real_gen_comp(order,matrix,diag,m,n,&A(1,1,k), lda,"%8.4f"," ",Nag_NoLabels,0, Nag_NoLabels,0,80,0,0,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_file_print_matrix_real_gen_comp (x04cbc).\n%s\n", fail.message); exit_status=2; gotoEND; } printf("\n"); fflush(stdout); } /* nag_wav_dim3_init (c09acc). * Three-dimensional wavelet filter initialization */ nag_wav_dim3_init(wavnamenum,Nag_SingleLevel,modenum,m,n,fr,&nwl,&nf, &nwct,&nwcn,&nwcfr,icomm,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_wav_dim3_init (c09acc).\n%s\n",fail.message); exit_status=3; gotoEND; } /* Calculate the number of wavelet coefficients in * the first dimension, nwcm. */ nwcm=nwct/(8*nwcn*nwcfr); lenc=nwct; /* Allocate space for the coefficients array, C */ if(!(c=NAG_ALLOC((lenc),double))){ printf("Allocation failure\n"); exit_status=4; gotoEND; } /* nag_wav_dim3_sngl_fwd (c09fac). * Three-dimensional discrete wavelet transform */ nag_wav_dim3_sngl_fwd(m,n,fr,a,lda,sda,lenc,c,icomm,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_wav_dim3_sngl_fwd (c09fac).\n%s\n",fail.message); exit_status=5; gotoEND; } /* Allocate space for extraction of coefficients of a single type */ if(!(d=NAG_ALLOC((nwcm)*(nwcn)*(nwcfr),double))){ printf("Allocation failure\n"); exit_status=6; gotoEND; } for(cindex=0;cindex<=7;cindex++){ /* Use the extraction routine c09fyc to retrieve the required * coefficients. */ /* nag_wav_dim3_coeff_ext (c09fyc). * Extract the nominated coefficients. */ nag_wav_dim3_coeff_ext(zero,cindex,lenc,c,d,nwcm,nwcn,icomm,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_wav_dim3_coeff_ext (c09fyc).\n%s\n",fail.message); exit_status=7; gotoEND; } /* Print out the extracted coefficients */ switch(cindex){ case0: printf("Approximation coefficients (LLL)\n"); break; case1: printf("Detail coefficients (LLH)\n"); break; case2: printf("Detail coefficients (LHL)\n"); break; case3: printf("Detail coefficients (LHH)\n"); break; case4: printf("Detail coefficients (HLL)\n"); break; case5: printf("Detail coefficients (HLH)\n"); break; case6: printf("Detail coefficients (HHL)\n"); break; case7: printf("Detail coefficients (HHH)\n"); break; } for(i=1;i<=nwcm;i++){ if(i==1){ printf("Coefficients "); for(k=1;k<=nwcfr;k++){ printf("Frame %4"NAG_IFMT,k); for(j=1;j<=9*nwcn-8;j++) printf(" "); } printf("\n"); } for(k=1;k<=nwcfr;k++){ if(k==1&&i==1) printf("%5"NAG_IFMT"%8s",cindex," "); elseif(k==1) printf("%13s"," "); else printf("%2s"," "); for(j=1;j<=nwcn;j++){ printf("%8.4f ",D(i,j,k)); } } printf("\n"); } printf("\n"); } fflush(stdout); /* nag_wav_dim3_sngl_inv (c09fbc). * Three-dimensional inverse discrete wavelet transform */ nag_wav_dim3_sngl_inv(m,n,fr,lenc,c,b,ldb,sdb,icomm,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_wav_dim3_sngl_inv (c09fbc).\n%s\n",fail.message); exit_status=8; gotoEND; } printf("Output Data :\n"); fflush(stdout); for(k=1;k<=fr;k++){ /* nag_file_print_matrix_real_gen_comp (x04cbc). * Prints out a matrix. */ nag_file_print_matrix_real_gen_comp(order,matrix,diag,m,n,&B(1,1,k), ldb,"%8.4f"," ",Nag_NoLabels,0, Nag_NoLabels,0,80,0,0,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_file_print_matrix_real_gen_comp (x04cbc).\n%s\n", fail.message); exit_status=9; gotoEND; } printf("\n"); fflush(stdout); } END: NAG_FREE(a); NAG_FREE(b); NAG_FREE(c); NAG_FREE(d); returnexit_status; }