From 19894b4be6a9bac32e9e92a59003ffbc9e685d15 Mon Sep 17 00:00:00 2001 From: Sergio Pascual Date: Feb 23 2008 22:36:52 +0000 Subject: *** empty log message *** --- diff --git a/.cvsignore b/.cvsignore index e69de29..1154ddb 100644 --- a/.cvsignore +++ b/.cvsignore @@ -0,0 +1 @@ +cloudy_v07_02_01.tar.gz diff --git a/cloudy-doxygen.patch b/cloudy-doxygen.patch new file mode 100644 index 0000000..1b2e8fe --- /dev/null +++ b/cloudy-doxygen.patch @@ -0,0 +1,30 @@ +diff -ur c07.02.01/doxygen/Doxyfile c07.02.01.new/doxygen/Doxyfile +--- c07.02.01/doxygen/Doxyfile 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/doxygen/Doxyfile 2008-02-13 22:33:21.000000000 +0100 +@@ -5,7 +5,7 @@ + #--------------------------------------------------------------------------- + PROJECT_NAME = cloudy + PROJECT_NUMBER = trunk +-OUTPUT_DIRECTORY = C:/projects/cloudy/trunk/doxygen ++OUTPUT_DIRECTORY = . + CREATE_SUBDIRS = NO + OUTPUT_LANGUAGE = English + USE_WINDOWS_ENCODING = YES +@@ -25,7 +25,7 @@ + ALWAYS_DETAILED_SEC = NO + INLINE_INHERITED_MEMB = NO + FULL_PATH_NAMES = YES +-STRIP_FROM_PATH = c:/projects/ ++STRIP_FROM_PATH = + STRIP_FROM_INC_PATH = + SHORT_NAMES = NO + JAVADOC_AUTOBRIEF = NO +@@ -82,7 +82,7 @@ + #--------------------------------------------------------------------------- + # configuration options related to the input files + #--------------------------------------------------------------------------- +-INPUT = C:/projects/Cloudy/trunk/source ++INPUT = ../source + FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ diff --git a/cloudy-hotfixes-20080214.patch b/cloudy-hotfixes-20080214.patch new file mode 100644 index 0000000..110759a --- /dev/null +++ b/cloudy-hotfixes-20080214.patch @@ -0,0 +1,342 @@ +diff -ur c07.02.01/source/cont_setintensity.cpp c07.02.01.new/source/cont_setintensity.cpp +--- c07.02.01/source/cont_setintensity.cpp 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/source/cont_setintensity.cpp 2008-02-14 12:27:26.000000000 +0100 +@@ -199,6 +199,13 @@ + /*fprintf(ioQQQ,"DEBUG %4li %e %e %.3e %.3e\n", + i , rfield.anu[i] , (amean2/amean) , amean2 , amean );*/ + rfield.anu[i] = (float)(amean2/amean); ++ if( i ) ++ { ++ /* prevent roundoff from allowing i cell to lie below i-1 ++ * * cell when continuum mesh is very fine */ ++ rfield.anu[i] = MAX2( rfield.anu[i] , rfield.anu[i-1]*(1.f+FLT_EPSILON) ); ++ ASSERT( rfield.anu[i] > rfield.anu[i-1] ); ++ } + rfield.anu2[i] = (float)(amean3/amean); + } + +diff -ur c07.02.01/source/grid_xspec.cpp c07.02.01.new/source/grid_xspec.cpp +--- c07.02.01/source/grid_xspec.cpp 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/source/grid_xspec.cpp 2008-02-14 12:34:06.000000000 +0100 +@@ -72,7 +72,7 @@ + + sprintf( grid.paramNames[i], "%s%ld", "PARAM", i+1 ); + /* Method is 0 for linear, 1 for logarithmic, for now all linear. */ +- grid.paramMethods[i] = 1; ++ grid.paramMethods[i] = 0; + /* Initial */ + grid.paramRange[i][0] = xc[i]+grid.paramIncrements[i]*(grid.numParamValues[i]-1.f)/2.f; + /* Delta */ +diff -ur c07.02.01/source/iso_create.cpp c07.02.01.new/source/iso_create.cpp +--- c07.02.01/source/iso_create.cpp 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/source/iso_create.cpp 2008-02-14 12:31:27.000000000 +0100 +@@ -364,7 +364,7 @@ + } + else + { +- jj = jj; ++ jj = j; + } + hydro.strkar[n][j] = (float)pow(((float)ii*jj),1.2f); + hydro.pestrk[n][j] = 0.; +diff -ur c07.02.01/source/opacity.h c07.02.01.new/source/opacity.h +--- c07.02.01/source/opacity.h 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/source/opacity.h 2008-02-14 12:40:08.000000000 +0100 +@@ -172,7 +172,7 @@ + /** another case b option, turn off background opacities, no Pdest */ + bool lgCaseB_no_pdest; + +- /** optical depths to compton and H- */ ++ /** optical depths to Compton and H- */ + float telec, + thmin; + +@@ -203,9 +203,6 @@ + * depths have been predicted yet */ + bool lgTauOutOn; + +- /** which opacity to punch out */ +- char chOpcTyp[5]; +- + /** total number of opacity cells used in opacity stack + * in OpacityCreateAll used as a counter to remember where + * next opacity goes */ +@@ -217,7 +214,7 @@ + * in OpacityCreateAll + */ + +- /** ipRayScat opacity pointer for rayleigh scattering*/ ++ /** ipRayScat opacity pointer for Rayleigh scattering*/ + long int ipRayScat, + + /** iopcom compton scatterin, total recoil*/ +diff -ur c07.02.01/source/parse_grain.cpp c07.02.01.new/source/parse_grain.cpp +--- c07.02.01/source/parse_grain.cpp 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/source/parse_grain.cpp 2008-02-14 12:31:02.000000000 +0100 +@@ -364,8 +364,8 @@ + /* find out how long chOption is - it was declared as a pointer, then + * set equal to a local string */ + length = strlen( chOption ); +- if( length == 0 ) +- TotalInsanity(); ++ /*if( length == 0 ) ++ TotalInsanity();*/ + + /* make sure we have enough room to store the string */ + if( length > static_cast(FILENAME_PATH_LENGTH_2) ) +diff -ur c07.02.01/source/parse_punch.cpp c07.02.01.new/source/parse_punch.cpp +--- c07.02.01/source/parse_punch.cpp 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/source/parse_punch.cpp 2008-02-14 12:40:08.000000000 +0100 +@@ -239,7 +239,7 @@ + { + /* DoPunch will call punch_opacity to parse the subcommands + * punch total opacity */ +- strcpy( opac.chOpcTyp, "TOTL" ); ++ strcpy( punch.chOpcTyp[punch.npunch], "TOTL" ); + sprintf( chHeader, + "#nu\tTot opac\tAbs opac\tScat opac\tAlbedo\telem\n" ); + } +@@ -247,24 +247,25 @@ + else if( nMatch("FIGU",chCard) ) + { + /* do figure for hazy */ +- strcpy( opac.chOpcTyp, "FIGU" ); ++ strcpy( punch.chOpcTyp[punch.npunch], "FIGU" ); + sprintf( chHeader, + "#nu, H, He, tot opac\n" ); + } + + else if( nMatch("FINE",chCard) ) + { +- /* punch out the fine opacity array with only lines */ ++ /* punch the fine opacity array */ + rfield.lgPunchOpacityFine = true; +- strcpy( opac.chOpcTyp, "FINE" ); ++ strcpy( punch.chOpcTyp[punch.npunch], "FINE" ); + /* check for keyword UNITS on line, then scan wavelength or energy units if present, +- * units are copied into punch.chConPunEnr */ ++ * units are copied into punch.chConPunEnr */ + ChkUnits(chCard); + + sprintf( chHeader, + "#nu\topac\n" ); + ipFFmt = 5; +- /* range option - important since so much data */ ++ /* range option - important since so much data - usually want to ++ * only give portion of the continuum */ + if( nMatch("RANGE",chCard) ) + { + /* get lower and upper range, must be in Ryd */ +@@ -296,6 +297,7 @@ + /* default is to average together ten */ + if( lgEOL ) + punch.punarg[punch.npunch][2] = 10; ++ + if( punch.punarg[punch.npunch][2] < 1 ) + { + fprintf(ioQQQ,"The number of fine opacities to skip must be > 0 \nSorry.\n"); +@@ -316,7 +318,7 @@ + else if( nMatch("BREM",chCard) ) + { + /* punch bremsstrahlung opacity */ +- strcpy( opac.chOpcTyp, "BREM" ); ++ strcpy( punch.chOpcTyp[punch.npunch], "BREM" ); + sprintf( chHeader, + "#nu\tbrem opac\n" ); + } +@@ -327,7 +329,7 @@ + strcpy( punch.chPunch[punch.npunch], "OPAC" ); + + /* punch subshell cross sections */ +- strcpy( opac.chOpcTyp, "SHEL" ); ++ strcpy( punch.chOpcTyp[punch.npunch], "SHEL" ); + + /* this is element */ + ipFFmt = 3; +@@ -370,7 +372,7 @@ + } + + /* copy string over */ +- strcpy( opac.chOpcTyp, elementnames.chElementNameShort[nelem] ); ++ strcpy( punch.chOpcTyp[punch.npunch], elementnames.chElementNameShort[nelem] ); + } + else + { +@@ -437,7 +439,7 @@ + else if( nMatch("OPAC",chCard) ) + { + /* create table for appendix in AGN */ +- strcpy( opac.chOpcTyp, " AGN" ); ++ strcpy( punch.chOpcTyp[punch.npunch], " AGN" ); + strcpy( punch.chPunch[punch.npunch], "OPAC" ); + } + +diff -ur c07.02.01/source/parse_set.cpp c07.02.01.new/source/parse_set.cpp +--- c07.02.01/source/parse_set.cpp 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/source/parse_set.cpp 2008-02-14 12:33:46.000000000 +0100 +@@ -109,7 +109,7 @@ + { + if( nMatch( " NEW" , chCard ) ) + { +- dense.lgAsChoose[nelem][ion] = true; ++ dense.lgAsChoose[nelem][ion-1] = true; + } + else if( nMatch( " OLD" , chCard ) ) + { +diff -ur c07.02.01/source/prt_lines_lv1_li_ne.cpp c07.02.01.new/source/prt_lines_lv1_li_ne.cpp +--- c07.02.01/source/prt_lines_lv1_li_ne.cpp 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/source/prt_lines_lv1_li_ne.cpp 2008-02-14 12:28:26.000000000 +0100 +@@ -912,6 +912,8 @@ + + /* recombination and specific pump for OII 4638.86-4696.35 (8 lines) */ + rec = GetLineRec(82, 4651 ); ++ PntForLine(4651.,"O 2",&ipnt); ++ lindst(rec,4651,"O 2r",ipnt,'i',true ); + /* convert UV pump rate to intensity with branching ratio and hnu */ + /* recombination part of O II 4651 line */ + linadd(rec,4651,"O 2r",'i' ); +diff -ur c07.02.01/source/punch.h c07.02.01.new/source/punch.h +--- c07.02.01/source/punch.h 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/source/punch.h 2008-02-14 12:40:08.000000000 +0100 +@@ -147,6 +147,9 @@ + /**chPunch - what is it we want to punch? set in GetPunch, used in DoPunch */ + char chPunch[LIMPUN][5]; + ++ /** which opacity to punch out */ ++ char chOpcTyp[LIMPUN][5]; ++ + /** this flag tells us whether to punch results of a grid to separate files + * for each grid point or all to the same file. Different for different + * punch commands */ +diff -ur c07.02.01/source/punch_opacity.cpp c07.02.01.new/source/punch_opacity.cpp +--- c07.02.01/source/punch_opacity.cpp 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/source/punch_opacity.cpp 2008-02-14 12:40:08.000000000 +0100 +@@ -49,7 +49,7 @@ + /* punch total opacity in any element, punch opacity command + * ioPUN is ioPUN unit number, ipPun is pointer within stack of punches */ + +- if( strcmp(opac.chOpcTyp,"TOTL") == 0 ) ++ if( strcmp(punch.chOpcTyp[ipPun],"TOTL") == 0 ) + /* total opacity */ + { + for( j=0; j < rfield.nflux; j++ ) +@@ -66,8 +66,8 @@ + fprintf( ioPUN, "\n" ); + } + +- else if( strcmp(opac.chOpcTyp,"BREM") == 0 ) +- /* brems opacity */ ++ else if( strcmp(punch.chOpcTyp[ipPun],"BREM") == 0 ) ++ /* bremsstrahlung opacity */ + { + for( j=0; j < rfield.nflux; j++ ) + { +@@ -80,7 +80,7 @@ + } + + /* subshell photo cross sections */ +- else if( strcmp(opac.chOpcTyp,"SHEL") == 0 ) ++ else if( strcmp(punch.chOpcTyp[ipPun],"SHEL") == 0 ) + { + nelem = (long)punch.punarg[ipPun][0]; + ion = (long)punch.punarg[ipPun][1]; +@@ -95,7 +95,7 @@ + } + } + +- else if( strcmp(opac.chOpcTyp,"FINE") == 0 ) ++ else if( strcmp(punch.chOpcTyp[ipPun],"FINE") == 0 ) + { + /* the fine opacity array */ + float sum; +@@ -119,7 +119,9 @@ + { + nu_hi = rfield.nfine; + } ++ + nskip = (long)punch.punarg[ipPun][2]; ++ ASSERT( nskip > 0 ); + + for( i=j; i 0. ) + fprintf(ioPUN,"%.5e\t%.3e\n", +- AnuUnit( rfield.fine_anu[i+k/2] ), sum ); ++ AnuUnit( rfield.fine_anu[i+k/2] ), sum ); + } + } + + /* figure for hazy */ +- else if( strcmp(opac.chOpcTyp,"FIGU") == 0 ) ++ else if( strcmp(punch.chOpcTyp[ipPun],"FIGU") == 0 ) + { + nelem = 0; + for( i=iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][0]-1; i < (iso.ipIsoLevNIonCon[ipHE_LIKE][ipHELIUM][0] - 1); i++ ) +@@ -166,7 +168,7 @@ + } + + /* photoionization data table for AGN */ +- else if( strcmp(opac.chOpcTyp," AGN") == 0 ) ++ else if( strcmp(punch.chOpcTyp[ipPun]," AGN") == 0 ) + { + long int + ipop, +@@ -234,7 +236,7 @@ + } + + /* hydrogen */ +- else if( strcmp(opac.chOpcTyp,"HYDR") == 0 ) ++ else if( strcmp(punch.chOpcTyp[ipPun],"HYDR") == 0 ) + { + nelem = ipHYDROGEN; + /* zero out the opacity arrays */ +@@ -278,7 +280,7 @@ + } + + /* helium */ +- else if( strcmp(opac.chOpcTyp,"HELI") == 0 ) ++ else if( strcmp(punch.chOpcTyp[ipPun],"HELI") == 0 ) + { + /* atomic helium first, HELI1.opc */ + nelem = ipHELIUM; +@@ -356,12 +358,12 @@ + + else + { +- /* check for hydroge through zinc, nelem is atomic number on the c scale */ ++ /* check for hydrogen through zinc, nelem is atomic number on the c scale */ + nelem = -1; + i = 0; + while( i < LIMELM ) + { +- if( strcmp(opac.chOpcTyp,elementnames.chElementNameShort[i]) == 0 ) ++ if( strcmp(punch.chOpcTyp[ipPun],elementnames.chElementNameShort[i]) == 0 ) + { + nelem = i; + break; +@@ -373,7 +375,7 @@ + if( nelem < 0 ) + { + fprintf( ioQQQ, " Unidentified opacity key=%4.4s\n", +- opac.chOpcTyp ); ++ punch.chOpcTyp[ipPun] ); + puts( "[Stop in punopac]" ); + cdEXIT(EXIT_FAILURE); + } +diff -ur c07.02.01/source/zero.cpp c07.02.01.new/source/zero.cpp +--- c07.02.01/source/zero.cpp 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/source/zero.cpp 2008-02-14 12:40:08.000000000 +0100 +@@ -1011,10 +1011,8 @@ + /* another case b option, turn off background opacities, no Pdest */ + opac.lgCaseB_no_pdest = false; + +- strcpy( opac.chOpcTyp, " " ); +- + /* smallest allowed line and Lya optical depths, reset with +- * caseb command */ ++ * Case B command */ + opac.taumin = 1e-20f; + opac.tlamin = 1e-20f; + diff --git a/cloudy-shared.patch b/cloudy-shared.patch new file mode 100644 index 0000000..07e1174 --- /dev/null +++ b/cloudy-shared.patch @@ -0,0 +1,47 @@ +diff -ur c07.02.01/source/Makefile c07.02.01.new/source/Makefile +--- c07.02.01/source/Makefile 2007-07-09 04:28:29.000000000 +0200 ++++ c07.02.01.new/source/Makefile 2008-02-14 11:31:59.000000000 +0100 +@@ -1,15 +1,17 @@ + # Makefile for compiling Cloudy on a g++ platform + # This works only with GNU make! + +-CXX = g++ +-CXXFLAGS = -ansi -g -O3 -Wall +-LDLIBS = -lm ++ ++ ++ + .PHONY: clean distclean depend + + # this is a filter to erase optimization flags from CXXFLAGS + OPTFILTER = -O -O1 -O2 -O3 -O4 -O5 -Os -xO -xO1 -xO2 -xO3 -xO4 -xO5 -fast + + CXXFLAGSNOOPT = ${filter-out ${OPTFILTER},${CXXFLAGS}} ++CXXNOLIBFLAGS := ${CXXFLAGS} ++CXXFLAGS = -fPIC -DPIC $(CXXNOLIBFLAGS) + + main := maincl.cpp + source := ${wildcard *.cpp} +@@ -31,16 +33,20 @@ + CDP = $(shell pwd)/../data/ + endif + +-cloudy.exe : maincl.o libcloudy.a +- ${CXX} ${CXXFLAGS} ${LDFLAGS} -o cloudy.exe maincl.o libcloudy.a ${LDLIBS} ++cloudy.exe : maincl.cpp libcloudy.so ++ ${CXX} ${CXXNOLIBFLAGS} ${LDFLAGS} -o cloudy.exe maincl.cpp -L. -lcloudy ${LDLIBS} + + libcloudy.a: ${libobjects} + ar ru libcloudy.a ${libobjects} + ${RANLIB} libcloudy.a + ++libcloudy.so: ${libobjects} ++ ${CXX} ${CXXFLAGS} -shared -o libcloudy.so.0 -Wl,-soname,libcloudy.so.0 ${libobjects} ${LDFLAGS} ++ ln -s libcloudy.so.0 libcloudy.so + clean : + rm -f *.o + rm -f libcloudy.a ++ rm -f libcloudy.so* + rm -f cloudy.exe + + distclean : diff --git a/cloudy.spec b/cloudy.spec new file mode 100644 index 0000000..a91c6b0 --- /dev/null +++ b/cloudy.spec @@ -0,0 +1,125 @@ +Name: cloudy +Version: 07.02.01 +Release: 1%{?dist} +Summary: Spectral synthesis code to simulate conditions in interstellar matter + +%define upversion 07_02_01 + +Group: Applications/Engineering +License: BSD +URL: http://www.nublado.org/ +Source0: ftp://gradj.pa.uky.edu/gary/cloudy_gold/%{name}_v%{upversion}.tar.gz +Patch0: cloudy-doxygen.patch +Patch1: cloudy-shared.patch +Patch2: cloudy-hotfixes-20080214.patch +Buildroot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) + +Requires: %{name}-libs = %{version}-%{release} + +BuildRequires: doxygen graphviz tetex-latex + +%description +Most of the quantitative information we have about the cosmos comes from +spectroscopy. In many cases the light we analyze was produced by atoms in +the first generations of stars and galaxies. The spectra are produced by +dilute gas where such properties as the gas kinetic temperature, chemical +state, level of ionization, and level populations, are determined by a +host of microphysical processes rather than by a single temperature. +Analytical solutions are seldom possible and computer solutions are +needed to understand their physical properties. Numerical simulations make +it possible to understand complex physical environments starting from +first principles. Cloudy is designed to do exactly this. + +%package devel +Summary: Headers for developing programs that will use %{name} +Group: Development/Libraries +Requires: %{name}-libs = %{version}-%{release} + +%description devel +These are the header files and libraries needed to develop a %{name} +application. + +%package libs +Summary: Cloudy runtime libraries +Group: System Environment/Libraries +%description libs +Cloudy is a Spectral synthesis code to simulate conditions in +interstellar matter. This package contains the %{name} run-time library + +%package docs +Summary: Documentation for %{name}, includes full API docs +Group: Documentation + +%description docs +This package contains the full API documentation for %{name}. + +%prep +%setup -q -n c%{version} +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 + +%build +cd source +CXX="%{__cxx}" CXXFLAGS="%{optflags}" CLOUDY_DATA_PATH=%{_datadir}/%{name}/data/ \ +%{__make} %{?_smp_mflags} +cd .. +cd doxygen +doxygen Doxyfile +# Deleting empty files +find -empty -exec rm '{}' ';' +# Spurious file +find -name installdox -exec rm '{}' ';' + +%install +%{__rm} -fr %{buildroot} +%{__mkdir_p} %{buildroot}/%{_bindir} +%{__mkdir_p} %{buildroot}/%{_libdir} +%{__mkdir_p} %{buildroot}/%{_includedir}/%{name} +%{__mkdir_p} %{buildroot}/%{_datadir}/%{name}/data +%{__mkdir_p} %{buildroot}/%{_datadir}/%{name}/scripts +%{__mkdir_p} %{buildroot}/%{_datadir}/%{name}/grain +%{__install} -m 755 source/cloudy.exe %{buildroot}/%{_bindir}/cloudy +%{__install} -m 755 source/libcloudy.so.* %{buildroot}/%{_libdir} +%{__cp} -a source/libcloudy.so %{buildroot}/%{_libdir} +%{__cp} -a source/cddefines.h %{buildroot}/%{_includedir}/%{name} +%{__cp} -a source/cpu.h %{buildroot}/%{_includedir}/%{name} +%{__cp} -a source/cddrive.h %{buildroot}/%{_includedir}/%{name} +%{__cp} -a data/*.opc %{buildroot}/%{_datadir}/%{name}/data +%{__cp} -a data/*.ini %{buildroot}/%{_datadir}/%{name}/data +%{__cp} -a data/*.dat %{buildroot}/%{_datadir}/%{name}/data +%{__cp} -a data/*.rfi %{buildroot}/%{_datadir}/%{name}/grain +%{__cp} -a data/*.szd %{buildroot}/%{_datadir}/%{name}/grain +%{__cp} -a data/*.in %{buildroot}/%{_datadir}/%{name}/scripts + +%clean +%{__rm} -fr %{buildroot} + +%post libs -p /sbin/ldconfig + +%postun libs -p /sbin/ldconfig + +%files +%defattr(-,root,root,-) +%doc license.txt readme.txt docs/* +%{_bindir}/* + +%files libs +%defattr(-,root,root,-) +%doc license.txt data/readme_data.htm data/readme_LineList_dat.txt +%{_libdir}/lib%{name}.so.* +%{_datadir}/%{name}/* + +%files devel +%defattr(-,root,root,-) +%doc license.txt +%{_includedir}/%{name} +%{_libdir}/lib%{name}.so + +%files docs +%defattr(-,root,root,-) +%doc doxygen/html/* + +%changelog +* Thu Feb 14 2008 Sergio Pascual 07.02.01-1 +- Initial specfile diff --git a/sources b/sources index e69de29..bd54ce2 100644 --- a/sources +++ b/sources @@ -0,0 +1 @@ +a3fac860aad241da9bc21b5a37f6c8cb cloudy_v07_02_01.tar.gz